CodeForge

Python de Cero a Experto / Python avanzado

Iteradores y generadores

Teoría22 min20 XP

¿Cómo procesarías un archivo de un millón de líneas sin cargarlo entero en memoria? ¿O una secuencia infinita de números? La respuesta son los GENERADORES: funciones que producen valores UNO A LA VEZ, bajo demanda (perezosamente), en vez de calcularlos todos de golpe. Son una de las herramientas más elegantes y eficientes de Python, y la base de cómo el lenguaje recorre las cosas. Hoy dominas los generadores y la evaluación perezosa.

El dispensador vs la bodega

Generadores con yield

Una función que usa yield (en vez de return) es un GENERADOR: produce valores uno a uno, pausándose entre cada uno:

yield es como un return que PAUSA la función en vez de terminarla: entrega un valor, y cuando pides el siguiente, la función RETOMA justo donde se quedó (con sus variables intactas). contar_hasta no calcula todos los números de golpe: produce cada uno cuando lo pides. Lo recorres con for (que pide valores hasta que se acaben) o con next() (uno a uno). Es una función que "recuerda dónde iba" entre llamadas —algo imposible con una función normal—.

La ventaja: memoria y secuencias infinitas

¿Qué hace yield y cuál es la ventaja de un generador sobre una lista?

Mini-reto

Crea generadores para Mi Bolsillo: 1) un generador numerar(gastos) que reciba una lista y produzca strings tipo "1. Café", "2. Bus" (usa enumerate y yield); 2) un generador hasta_presupuesto(gastos, tope) que produzca gastos mientras la suma acumulada no supere tope (y se detenga); 3) usa una expresión generadora para sumar el IVA de una lista de valores sin crear una lista intermedia. Recórrelos con for y comprueba que producen bajo demanda.

Qué sigue

Ya produces valores perezosamente. La próxima lección trae una de las herramientas más elegantes (y al principio misteriosas) de Python: los DECORADORES —funciones que ENVUELVEN otras funciones para agregarles comportamiento (cronometrar, cachear, validar) sin tocar su código—. Los construirás desde cero.