Python: цикл по разделу elif оператора if - PullRequest
0 голосов
/ 14 мая 2018

Я относительно новичок в python, поэтому я даже не уверен, правильно ли я подхожу к этому. Но я нигде не нашел хорошего решения.

Чтобы избежать очень уродливого и повторяющегося кода, я хочу зациклить часть elif оператора if.

Это ужасный код, который я хочу исправить:

def codeToChar(code):
chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"

if code == ord(chars[0]):   ##### SUPER UGLY
    return chars[0]
elif code == ord(chars[1]):
    return chars[1]
elif code == ord(chars[2]):
    return chars[2]
elif code == ord(chars[3]):
    return chars[3]
elif code == ord(chars[4]):
    return chars[4]
elif code == ord(chars[5]):
    return chars[5]
..... etc .....
else:
    return "wat"

Как видите, индекс увеличивается на единицу, поэтому я подумал, что зацикливание будет очень простым. Однако, когда я попробовал следующее, это не сработало, потому что это должно быть сформулировано как операторы if, elif, elif, else и не так много операторов if.

Моя неудачная попытка:

for x in xrange(0,len(chars)-1):
    if code == ord(chars[x]):
        return chars[x]
    else:
        return "wat"

Как бы я зациклился на этом? Примечание: если это имеет какое-либо значение, я кодирую это с помощью модуля curses, создавая интерфейс клавиатуры для проекта. Большое спасибо

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Используйте диктовку:

chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
chars_dict = {ord(c): c for c in chars}
return chars_dict.get(code, 'wat')
0 голосов
/ 14 мая 2018

Вы не хотите возвращать "wat" внутри цикла, так как он сработает, как только однажды произойдет сбой оператора if.Вы хотите вернуть ошибку, только если все итерации не пройдены.Для этого отсоедините блок else.

for x in xrange(0,len(chars)-1):
    if code == ord(chars[x]):
        return chars[x]
else:
    return "wat"

Блок else является необязательным.Вы также можете написать:

for x in xrange(0,len(chars)-1):
    if code == ord(chars[x]):
        return chars[x]
return "wat"
0 голосов
/ 14 мая 2018

Похоже, вы просто проверяете, является ли код одним из символов или нет. Одно чистое решение будет:

c = chr(code)
return c if c in chars else "wat"
0 голосов
/ 14 мая 2018
for c in chars:
    if code == ord(c):
        return c
return "wat"

секунда return выполняется только в том случае, если ранее return не выполнялось ранее (т. Е. Не найдено ни одного символа).

...