lunes, 7 de marzo de 2011

Generadores en python

Un objeto es iterable si es físicamente almacenado en una secuencia o un objeto que produce un resulto a la vez de una herramienta iterativa como la repetición 'for'. Los objetos iterables tienen implementado el método 'next()' , __next__() en python3.

Se puede iterar de distintas maneras listas de comprensión, for, while y generadores. Los generadores se dividen en funciones generadoras que devuelven un valor a la vez por medio de la sentencia yield, suspendiendo y resumiendo el estado del generador cada vez que se llama al siguiente elemento.



En este código se devuelve un elemento cada vez que se llama a la sentencia 'yield' sin tener que almacenar todos los valores en memoria.

El otro generador se denomina generadores de expresiones que funcionan de forma parecida a la comprensión de listas; debido a que, se pueden utilizar solamente expresiones y no bloques en su sintaxis, utilizan paréntesis en vez de corchetes en su sintaxis. Sin embargo, los generadores devuelven un objeto generador en vez de una lista en cada iteración.



Al final de una iteración siempre se levanta una excepción 'StopIteration', en el caso de la sentencia 'for' está excepción es tratada. Obteniendo los valores uno a la vez, los generadores permiten tener mejor rendimiento de memoria a costa de un mayor procesamiento. Su uso es adecuado en secuencias infinitas, o en secuencias de gran tamaño que vayan a tener que ser cargadas a memoria.

Comprensión de listas

La comprensión de listas permite crear listas a partir de otras listas. Su sintaxis se deriva de una construcción en la notación de teoría de conjuntos que aplica una expresión a cada elemento del conjunto.
la sentencia es:

L = [ expresión for element in secuencia]

Se usa cuando se quiere recorrer secuencias, a diferencia de la sentencia 'for' que corre sobre python puro, la compresión de listas mejora el rendimiento ya que está construido sobre C; por ello, se recomiendo iterar con comprensión de listas sobre grandes sencuencias. Además, provee una sintaxis que facilita la programación funcional:

l=[n for n in [1,2,3,4,5,6] if n%2.0==0]

equivalente a:



o también:


Como la comprensión de listas es una expresión, se puede utilizar en el cuerpo de las funciones lambda, listas de diccionarios, etc.