Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Формат генератора списка в параметре функции

#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



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

Комментариев нет:

Отправить комментарий