rendimento em compreensões de lista e expressões geradoras
O comportamento a seguir me parece bastante contra-intuitivo (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]
Os valores intermediários da última linha nem sempre são sempreNone
, eles são o que nóssend
no gerador, equivalente (eu acho) ao seguinte gerador:
def f():
for i in range(3):
yield (yield i)
Parece-me engraçado que essas três linhas funcionem. oReferência diz queyield
é permitido apenas em uma definição de função (embora eu possa estar lendo errado e / ou simplesmente tenha sido copiado da versão mais antiga). As duas primeiras linhas produzem umSyntaxError
no Python 2.7, mas a terceira linha não.
Além disso, parece estranho
que uma compreensão de lista retorna um gerador e não uma listae que a expressão do gerador convertida em uma lista e a compreensão da lista correspondente contenham valores diferentes.Alguém poderia fornecer mais informações?