Una lista suele representar todos sus valores ya reunidos. Un generador se parece más a una cinta que entrega un elemento cada vez y conserva dónde se había quedado.
Esa diferencia importa cuando los datos son numerosos, llegan poco a poco o ni siquiera sabes de antemano cuántos habrá.
Seguir el estado de un generador entre llamadas a next() y reconocer cuándo queda agotado.
El for ya sabe pedir valores a un iterador
colores = iter(["rojo", "verde", "azul"])
for color in colores:
print(color)iter(...) obtiene un iterador. El for le pide sucesivamente el siguiente elemento hasta que ya no quedan más.
En el uso diario, rara vez necesitas manejar el final manualmente; el bucle lo hace por ti.
yield entrega un valor y congela temporalmente la función
def cuenta_atras(desde):
actual = desde
while actual > 0:
yield actual
actual -= 1
for numero in cuenta_atras(3):
print(numero)Con return, una función termina. Con yield, entrega un valor, pausa y recuerda su estado. Cuando se solicita otro valor, continúa desde donde se detuvo.
Traza mental: para 3, el estado pasa por actual=3 → pausa → actual=2 → pausa → actual=1 → pausa → termina.
Consumir un generador significa avanzar por él
Un generador no es una lista reutilizable automáticamente. Si lo recorres hasta el final, ese mismo generador queda agotado.
def dos_valores():
yield "A"
yield "B"
g = dos_valores()
print(list(g))
print(list(g))Si necesitas recorrer los mismos datos varias veces y son pequeños, una lista puede ser más simple. Generador no significa «mejor»; significa «bajo demanda».
Mira cómo el generador se pausa
La fuente que puede proporcionar elementos.
El objeto que recuerda por dónde va.
Un generador es una forma cómoda de crear un iterador mediante yield.
Haz que el generador entregue cuadrados. Después observa que tres llamadas a next() continúan desde el punto donde quedó pausado.
1 4 9
La salida aparecerá aquí.
Necesito una pista
- No cambies el bucle; cambia el valor entregado por
yield.
Ver una solución razonada
def cuadrados():
for numero in [1, 2, 3]:
yield numero * numero
g = cuadrados()
print(next(g))
print(next(g))
print(next(g))¿Qué ocurriría con un cuarto next(g)?
El generador ya no tiene más valores y lanza StopIteration. Un for maneja ese agotamiento automáticamente.
El criterio no es «¿puedo usar yield?», sino «¿necesito todos los valores ya?»
- Una lista reúne sus elementos; un generador puede producirlos cuando se solicitan.
yieldpausa y conserva el estado de la función.- Un generador consumido no vuelve al principio por sí solo.
puedes explicar por qué un generador de un millón de elementos no necesita construir primero una lista de un millón de posiciones.