#python #python_3x
Почему в параметре метода join можно упускать квадратные скобки при генерации списка? my_str = ' '.join(i for i in ['rat','milk','pit','bull','dog'] if len(i)>3) Но A = i for i in ['rat','milk','pit','bull','dog'] if len(i)>3 вызовет ошибку.
Ответы
Ответ 1
Выражение без квадратных скобок ([]) и с ними — это два разных выражения. В Вашем примере Вы не используете квадратные скобки, поэтому следующее выражение: i for i in ['rat','milk','pit','bull','dog'] if len(i)>3 расценивается как генератор (generator expression или же genexpr). Обычно такие выражения обрамляются в круглые скобки (()), но они иногда могут быть опущены, как в первом Вашем примере. Если же квадратные скобки использовать: [i for i in ['rat','milk','pit','bull','dog'] if len(i)>3] то это уже будет списковое включение (list comprehension или же listcomp). Большой разницы между ними нет. Если в кратце, то генератор возвращает значения по одному и только если его "попросить", а списковое включение сразу возвращает готовый список. В Вашем примере эта разница неочевидна. Всё потому, что метод join поддерживает методы итерирования и сам по одному "просит" элементы из генератора. Теперь давайте докажем это, проведя дизассемблирование кода. Чтоб уж наверняка :) Генератор: print(dis.dis(r"x = ' '.join(i for i in [1, 2, 3])")) stdout (частично): 4 LOAD_CONST 1 (at ..., file "
", line 1>) # ^^^^^^^ Списковое включение: print(dis.dis(r"x = ' '.join([i for i in [1, 2, 3]])")) stdout (частично): 4 LOAD_CONST 1 ( at ..., file "
", line 1>) # ^^^^^^^^ Ответ 2
Круглые скобки могут быть опущены в генераторном выражении, если это не создаёт неоднозначности. Проще говоря, когда оно используется в качестве единственного аргумента функции. На списковые и словарные включения это не распространяется.
Комментариев нет:
Отправить комментарий