La característica del iterador introducida en Python 2.2 y el módulo itertools facilitan escribir programas que recorren grandes conjuntos de datos sin mantener el conjunto completo de datos en memoria. Las listas autodefinidas no encajan bien en la foto, porque generan un objeto lista de Python que contiene todos los elementos. Esto hace inevitable meter todos los objetos en la memoria, lo que puede suponer un problema si el conjunto de datos es grande. Al intentar escribir un programa de estilo funcional, sería natural escribir algo como:
enlaces = [enlace for enlace in obtener_todos_enlaces() if not enlace.recorrido] for enlace in enlaces: ...
en lugar de
for enlace in obtener_todos_enlaces(): if enlace.recorrido: continue ...
la primera forma es más compacta y quizás más legible, pero si se trata con una gran cantidad de objetos enlaces tendrías que escribir la segunda forma para evitar tener todos los objetos enlace en memoria a la vez.
Las expresiones generadoras funcionan de manera similar a las listas autodefinidas pero no materializan la lista entera; en lugar de esto, crean un generador que devolverá los elementos de uno en uno. El ejemplo anterior se podría escribir como:
enlaces = (enlace for enlace in obtener_todos_enlaces() if not enlace.recorrido) for enlace in enlaces: ...
Las expresiones generadoras siempre se han de encerrar entre paréntesis, como en el ejemplo anterior. Los paréntesis de llamada a una función también valen, por lo que para crear un iterador que se va a utilizar de inmediato como único parámetro de una función, se puede escribir:
print sum(obj.cuenta for obj in lista_de_todos())
Las expresiones generadoras difieren de las listas autodefinidas en diversos detalles. El más visible es que la variable del bucle (obj en el caso del ejemplo anterior) no es accesible desde fuera de la expresión generadora. Las listas autodefinidas dejan la variable con el último valor de la lista, aunque las futuras versiones de Python cambiarán esto, ajustando el comportamiento al de las listas generadoras en este aspecto.
See Also:
Consultar en Acerca de este documento... información para sugerir cambios.