En el shell de Python, si ingreso una lista de comprensión como:
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
Obtengo un resultado muy bien impreso:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
Lo mismo para la comprensión de un diccionario:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
Si ingreso una expresión generadora, no obtengo una respuesta tan amigable:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
Sé que puedo hacerlo:
>>> for i in _: print i,
a c g i m n o p s u B M
Aparte de eso (o escribiendo una función auxiliar) ¿puedo evaluar e imprimir fácilmente ese objeto generador en el shell interactivo?
generator object
mientras construyo una comprensión interactivamente en el indicador interactivo. Llamarlist(_)
hace eso. Lo que he hecho es usar listas de comprensión y luego convertirlas en genexp en un código más grande. Estos pueden fallar en tiempo de ejecución de formas que no ocurre con las listas por comprensión.list()
, y luego imprimirlos.Respuestas:
Respuesta rápida:
Hacer
list()
alrededor de una expresión generadora es (casi) exactamente equivalente a tener[]
corchetes alrededor. Así que sí, puedes hacerPero también puedes hacerlo
Sí, eso convertirá la expresión del generador en una lista de comprensión. Es lo mismo y lista de llamadas () en él. Entonces, la forma de convertir una expresión generadora en una lista es ponerla entre corchetes.
Explicación detallada:
Una expresión generadora es una expresión "desnuda"
for
. Al igual que:Ahora, no puede pegar eso en una línea por sí solo, obtendrá un error de sintaxis. Pero puedes ponerlo entre paréntesis.
Esto a veces se llama comprensión del generador, aunque creo que el nombre oficial sigue siendo expresión del generador, en realidad no hay ninguna diferencia, los paréntesis solo están ahí para que la sintaxis sea válida. No los necesita si lo pasa como el único parámetro a una función, por ejemplo:
Básicamente, todas las demás comprensiones disponibles en Python 3 y Python 2.7 son solo azúcar sintáctica alrededor de una expresión generadora. Establecer comprensiones:
Dict comprensiones:
Y enumere las comprensiones en Python 3:
En Python 2, las listas por comprensión no son solo azúcar sintáctica. Pero la única diferencia es que x bajo Python 2 se filtrará en el espacio de nombres.
Mientras esté bajo Python 3, obtendrá
Esto significa que la mejor manera de obtener una buena impresión del contenido de su expresión generadora en Python es hacer una lista de comprensión. Sin embargo, esto obviamente no funcionará si ya tiene un objeto generador. Hacer eso solo hará una lista de un generador:
En ese caso, deberá llamar a
list()
:Aunque esto funciona, pero es un poco estúpido:
fuente
list( generator-expression )
no imprime la expresión del generador; está generando una lista (y luego imprimiéndola en un shell interactivo). En lugar de generar una lista, en Python 3, podría dividir la expresión del generador en una declaración de impresión. Es decir)print(*(generator-expression))
. Esto imprime los elementos sin comas y sin corchetes al principio y al final.A diferencia de una lista o un diccionario, un generador puede ser infinito. Hacer esto no funcionaría:
Además, leer un generador lo cambia, por lo que no hay una manera perfecta de verlo. Para ver una muestra de la salida del generador, puede hacer
fuente
Puede simplemente envolver la expresión en una llamada a
list
:fuente
O siempre puede
map
sobre un iterador, sin la necesidad de crear una lista intermedia:fuente
fuente