#python #if-statement #scope
#python #if-statement #область видимости
Вопрос:
Я хотел спросить три вещи. Во-первых, для 10-й строки это оператор ‘else’? Похоже, это не так — если это не так, какой цели это служит?
Во-вторых, для 8-й строки мы говорим, что если ‘val’ находится в списке char_set, то возвращает False ? И, вообще говоря, так ли мы бы это написали?
Наконец, для строки 5, что делает [False для _ в диапазоне (128)] ? Спасибо!
def unique(string):
if len(string) > 128:
return False
char_set = [False for _ in range(128)]
for char in string:
val = ord(char)
if char_set[val]:
return False
char_set[val] = True
return True
Ответ №1:
Давайте ответим на это в хронологическом порядке (выполнения кода):
- Строка 5
[False for _ in range(128)]
создает список из 128False
значений. Это понимание списка, которое можно переписать следующим образом:
char_set = []
for _ in range(128):
char_set.append(False)
_
Средства считывают значение из итератора ( range
объекта) и отбрасывают его.
- Строка 8:
val
этоord
символ, означающий число.char_set[val]
дает нам элемент по индексуval
, который инициализируется какFalse
. Во время вашего кода (в частности, строка 10) это может быть перезаписано как aTrue
.if
Здесь оператор проверяет, является ли значение в этом индексеTrue
. - Строка 10: это не
else
оператор, хотя в этом случае он работает так же. В этом коде, если условие в строке 8 не выполняется, то поток выполнения кода пропускается, как 9, и «проваливается» в строку 10, и жизнь продолжается. Если условие в строке 8 выполняется (т. Е.char_set[val]
ВыполняетсяTrue
), То выполняется строка 9, иreturn
оператор внезапно завершает вызов функции, возвращаяFalse
ее результат.
Комментарии:
1. также
[False for _ in range(128)]
может быть упрощено до[false] * 128
2. @Hadrian в этом случае да, потому
bool
что является неизменяемым, но в противном случае происходит сглаживание.