Glosario de Python

Qué es un generador en Python

Un generador produce valores uno a uno, bajo demanda, y recuerda por dónde va.

Definición

Una función con yield es un generador: entrega un valor y se pausa conservando su estado. next(g) pide el siguiente valor y la reanuda justo después del último yield.

Llamar a la función no ejecuta su cuerpo; solo prepara el generador. Un generador consumido no vuelve al principio por sí solo: para repetir, crea otro.

Ejemplo

ejemplo.py
def cuadrados():
    for n in [1, 2, 3]:
        yield n * n

g = cuadrados()
print(next(g))
print(list(g))
print(list(g))

Al ejecutarlo, Python muestra:

Salida
1
[4, 9]
[]

Puedes copiar el ejemplo y cambiarlo en el editor Python del navegador: modificar un valor y predecir el resultado es la mejor forma de fijar el concepto.

Error frecuente

Después de consumirlo, list(g) devuelve una lista vacía, y un next adicional lanza StopIteration. Si necesitas recorrer los datos varias veces, una lista es más sencilla.

Cómo se diferencia de otros conceptos

Un generador se parece a una lista porque se puede recorrer con for, pero no guarda todos los valores a la vez: los produce cuando se piden. Eso ahorra memoria con secuencias grandes, a cambio de que solo se pueda recorrer una vez. Para datos pequeños que vas a consultar varias veces, una lista es más sencilla.

Preguntas frecuentes

¿Qué diferencia hay entre return y yield?

return termina la función y entrega un valor; yield entrega un valor y deja la función pausada para continuar después.

¿Por qué mi generador devuelve una lista vacía la segunda vez?

Porque ya se consumió. Un generador agotado no se reinicia: llama de nuevo a la función para crear otro.

Dónde seguir