Expresiones generadoras, funciones con yield, yield from y casos de uso prácticos.
# Generador infinito: nunca lanza StopIteration por si solodef fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci()for _ in range(7): print(next(fib), end=' ') # 0 1 1 2 3 5 8Si una función tiene yield en cualquier parte de su cuerpo, es una función generadora — incluso si ese yield nunca llega a ejecutarse en la práctica. Llamarla siempre retorna un generador, nunca ejecuta el cuerpo directamente.
El tracing de next/send es justo lo que pide la Pregunta 4 de la I2: seguir paso a paso qué recibe cada yield, qué valor devuelve el generador y cómo cambia su estado interno entre llamadas. La clave: el generador pausa en el yield y retoma exactamente ahí en la siguiente llamada, conservando sus variables locales.
for line in file ya es un generador nativo de Python — itera línea a línea sin cargar el archivo completo. Usar readlines() cargaría todo a la vez y podría llenar la RAM con archivos de varios GB.