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
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:
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
- Aprende el concepto paso a paso en la lección Sigue valores producidos bajo demanda.
- Función: definición y ejemplo
- Comprehension: definición y ejemplo
- Decorador: definición y ejemplo
- Ver todos los términos del glosario