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?