Gener Adores
Gener Adores
Los generados son funciones especiales que nos van devolviendo una secuencia
de valores de a un elemento por cada vez que la llamamos. Además, los generadores
son una forma sencilla y potente de iterador.
Los generadores sirven para crear iteradores pero de manera lazy (o perezosa).
Ya que el iterador tiene que tener todos los elementos disponibles. En cambio, los
generadores van generando el nuevo valor cada vez que se llama al método __next__().
Una característica de los generadores que se desprende de esta propiedad es que puedo
tener generadores que generan infinitos elementos. Por ejemplo, un generador de los
números naturales.
Material de la Universidad Austral, preparado por el profesor Agustín Olmedo, Buenos Aires, Argentina, en febrero
de 2019 para su uso en el Programa Especializado de “Aprende a programar con Python”. Prohibida la
reproducción, total o parcial sin previa autorización escrita por parte del autor.
Para utilizarlo, primero hay que crear una instancia del generador y luego se
obtienen los valores generados con la función __next__()1. Cuando se termina de
generar todos los valores, el generador lanza una excepción del tipo StopIteration.
Notar que al igual que los iteradores, los generadores se pueden consumir con
un ciclo for.
def naturales():
n=1
while True:
yield n
n=n+1
naturales = naturales()
1
Al igual que los iteradores, devuelve el siguiente valor con la función __next__(). Como vimos la
diferencia radica en que el iterador ya tiene todos los valores disponibles y el generador los va generando
uno a uno cuando se le pide.
2
Si dentro del generador hay una sentencia return, al ejecutar esta sentencia se
lanza una excepción del tipo StopIteration, notificando de esta manera que ya se
generaron todos los valores. Por ejemplo, si quiere crear un generador que me devuelva
los primeros n números naturales:
def n_naturales(n):
i=1
while True:
if i > n:
return
yield i
i=i+1
# Generador
(p for p in range(10) if p % 2 == 0)
<generator object <genexpr> at 0x10f1a3190>
3
Por último, veamos en qué casos es útil utilizar los generadores: