Следующее поведение кажется мне довольно противоречивым (Python 3.4):
>>> [(yield i) for i in range(3)]
<generator object <listcomp> at 0x0245C148>
>>> list([(yield i) for i in range(3)])
[0, 1, 2]
>>> list((yield i) for i in range(3))
[0, None, 1, None, 2, None]
Промежуточные значения последней строки на самом деле не всегда None
, они все равно send
в генератор, эквивалентные (я думаю), к следующему генератору:
def f():
for i in range(3):
yield (yield i)
Мне кажется забавным, что эти три линии работают вообще. Reference говорит, что yield
разрешено только в определении функции (хотя, возможно, я читаю его неправильно и/или его можно просто скопировать из старого версия). Первые две строки производят SyntaxError
в Python 2.7, но в третьей строке нет.
Кроме того, кажется странным
- что понимание списка возвращает генератор, а не список
- и что выражение генератора, преобразованное в список и соответствующее понимание списка, содержит разные значения.
Может ли кто-нибудь предоставить дополнительную информацию?