В оболочке Python, если я ввожу понимание списка, например:
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
Получаю красиво напечатанный результат:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
То же самое для понимания словаря:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
Если я ввожу выражение генератора, я получаю не такой дружелюбный ответ:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
Я знаю, что могу это сделать:
>>> for i in _: print i,
a c g i m n o p s u B M
Помимо этого (или написания вспомогательной функции) могу ли я легко оценить и распечатать этот объект-генератор в интерактивной оболочке?
generator object
поскольку я интерактивно выстраиваю понимание в интерактивной подсказке. Звонокlist(_)
делает это. То, что я сделал, - это использование списков, а затем преобразование их в genexp в более крупном коде. Они могут дать сбой во время выполнения, чего не могут сделать перечисления.list()
, а затем распечатать их.Ответы:
Быстрый ответ:
Обращение
list()
с выражением генератора (почти) в точности эквивалентно заключению его в[]
скобки. Так что да, ты можешь сделатьНо вы также можете сделать
Да, это превратит выражение генератора в понимание списка. То же самое и со списком вызовов (). Таким образом, чтобы преобразовать выражение генератора в список, нужно заключить его в скобки.
Детальное объяснение:
Выражение генератора - это «голое»
for
выражение. Вот так:Теперь вы не можете вставить это в отдельную строку, вы получите синтаксическую ошибку. Но вы можете заключить его в скобки.
Иногда это называют пониманием генератора, хотя я думаю, что официальное название по-прежнему является выражением генератора, на самом деле нет никакой разницы, скобки нужны только для того, чтобы синтаксис был действительным. Они вам не нужны, если вы передаете его как единственный параметр функции, например:
По сути, все другие понимания, доступные в Python 3 и Python 2.7, представляют собой просто синтаксический сахар вокруг выражения генератора. Установить понимание:
Диктовка:
И перечислите понимание в Python 3:
В Python 2 понимание списков - это не просто синтаксический сахар. Но единственная разница в том, что x будет в Python 2 просачиваться в пространство имен.
В Python 3 вы получите
Это означает, что лучший способ получить красивую распечатку содержимого выражения генератора на Python - это составить из него список! Однако это явно не сработает, если у вас уже есть объект-генератор. В результате будет создан список из одного генератора:
В этом случае вам нужно будет позвонить
list()
:Хотя это работает, но глупо:
источник
list( generator-expression )
не печатает выражение генератора; он создает список (а затем распечатывает его в интерактивной оболочке). Вместо создания списка в Python 3 вы можете преобразовать выражение генератора в оператор печати. Т.е.)print(*(generator-expression))
. Это печатает элементы без запятых и без скобок в начале и в конце.В отличие от списка или словаря, генератор может быть бесконечным. Это не сработает:
Кроме того, чтение генератора меняет его, поэтому нет идеального способа его просмотреть. Чтобы увидеть образец вывода генератора, вы можете сделать
источник
[next(g1) for i in range(10)]
в Python 3.Вы можете просто заключить выражение в вызов
list
:источник
Или вы всегда можете
map
использовать итератор без необходимости создавать промежуточный список:источник
источник