Generador de Fibonacci
Implementa la secuencia de Fibonacci con un generador Python. Aprende yield, lazy evaluation y cómo generar secuencias infinitas sin consumir memoria.
yield generator lazy evaluation next() itertools
El problema
Escribe una función generadora fibonacci() (sin parámetros) que produzca la secuencia de Fibonacci de forma infinita y perezosa (lazy).
Úsala junto con itertools.islice o un bucle con condición de parada para obtener los primeros N números.
Ejemplos
gen = fibonacci()
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
print(next(gen)) # 5
# Primeros 10 números
from itertools import islice
print(list(islice(fibonacci(), 10)))
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Concepto clave: yield y generadores
Un generador es una función que usa yield en lugar de return. En vez de ejecutarse hasta el final y devolver un valor, pausa en cada yield y cede el control al llamador:
def contar():
yield 1 # pausa aquí, devuelve 1
yield 2 # pausa aquí, devuelve 2
yield 3 # pausa aquí, devuelve 3
gen = contar()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
La ventaja clave: la función puede ser infinita porque solo genera un valor cuando se le pide.
Comparación: lista vs generador
# Lista: calcula todos los valores en memoria
def fibonacci_lista(n):
resultado = []
a, b = 0, 1
for _ in range(n):
resultado.append(a)
a, b = b, a + b
return resultado
# Generador: calcula solo cuando se pide (lazy)
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
Para 1.000 números: la lista usa O(n) memoria; el generador usa O(1).
Próximos pasos
- Escribe un generador
primos()que produzca números primos infinitamente - Usa
itertools.takewhilepara filtrar valores de un generador con una condición - Explora
itertools.chain,itertools.countyitertools.cyclepara ver qué más pueden hacer los generadores