Saltar al contenido principal

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.takewhile para filtrar valores de un generador con una condición
  • Explora itertools.chain, itertools.count y itertools.cycle para ver qué más pueden hacer los generadores