ceder en listas de comprensiones y expresiones generadoras

El siguiente comportamiento me parece bastante 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]

Los valores intermedios de la última línea en realidad no siempre sonNone, son lo que sea que nosotrossend en el generador, equivalente (supongo) al siguiente generador:

def f():
   for i in range(3):
      yield (yield i)

Me parece gracioso que esas tres líneas funcionen en absoluto. losReferencia dice queyield solo está permitido en una definición de función (aunque puede que lo esté leyendo mal y / o simplemente haya sido copiado de la versión anterior). Las dos primeras líneas producen unSyntaxError en Python 2.7, pero la tercera línea no.

Además, parece extraño

que una comprensión de la lista devuelve un generador y no una listay que la expresión generadora convertida en una lista y la comprensión de la lista correspondiente contienen valores diferentes.

¿Alguien podría proporcionar más información?

Respuestas a la pregunta(1)

Su respuesta a la pregunta