Вопрос о том, если после него указан оператор if if not thing?

#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)] создает список из 128 False значений. Это понимание списка, которое можно переписать следующим образом:
 char_set = []
for _ in range(128):
    char_set.append(False)
 

_ Средства считывают значение из итератора ( range объекта) и отбрасывают его.

  • Строка 8: val это ord символ, означающий число. char_set[val] дает нам элемент по индексу val , который инициализируется как False . Во время вашего кода (в частности, строка 10) это может быть перезаписано как a True . 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 что является неизменяемым, но в противном случае происходит сглаживание.