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?

questionAnswers(1)

yourAnswerToTheQuestion