Ejemplos de generadores
Veamos algunos ejemplo de generadores y del uso que podemos hacer con ellos.
Ejemplo potencias de 2
Vamos a crear un un generador para producir las primeras n potencias de 2:
def potencia_de_2(n):
resultado = 1
for i in range(n):
yield resultado
resultado *= 2
for v in potencia_de_2(8):
print(v)
Podemos usar nuestro generador con una lista por compresión:
def potencia_de_2(n):
resultado = 1
for i in range(n):
yield resultado
resultado *= 2
t = [x for x in potencia_de_2(5)]
print(t)
La función list() puede tomar un generador y crear una lista con los elementos devueltos:
def potencia_de_2(n):
resultado = 1
for i in range(n):
yield resultado
resultado *= 2
t = list(potencia_de_2(3))
print(t)
Además, podemos user el operador in con un generador:
def potencia_de_2(n):
resultado = 1
for i in range(n):
yield resultado
resultado *= 2
for i in range(20):
if i in potencia_de_2(4):
print(i)
Generador de números Fibonacci
Ahora veamos un generador de números de la serie Fibonacci, asegurándonos que se vea mucho mejor que la versión orientada a objetos basada en la implementación directa del protocolo iterador.
def fibonacci(n):
p = pp = 1
for i in range(n):
if i in [0, 1]:
yield 1
else:
n = p + pp
pp, p = p, n
yield n
fibs = list(fibonacci(10))
print(fibs)