Python de Cero a Experto / Python avanzado
Iteradores y generadores
¿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.