Generadores y yield
Las funciones generadoras usan yield para producir un flujo de valores de forma perezosa (lazy). Conservan el estado local entre pasos, lo que es ideal para archivos grandes, secuencias infinitas y pipelines ETL.
Busca en todas las páginas de la documentación
Las funciones generadoras usan yield para producir un flujo de valores de forma perezosa (lazy). Conservan el estado local entre pasos, lo que es ideal para archivos grandes, secuencias infinitas y pipelines ETL.
def squares(n: int):
for i in range(n):
yield i * i
for value in squares(5):
print(value)Cuándo usar esto:
from pathlib import Path
def read_lines(path: Path):
with path.open(encoding="utf-8") as fh:
for line in fh:
yield line.rstrip("\n")
def filter_nonempty(lines):
for line in lines:
if line.strip():
yield line
def parse_csv_rows(lines):
for line in lines:
yield line.split(",")
def pipeline(path: Path):
lines = read_lines(path)
nonempty = filter_nonempty(lines)
return parse_csv_rows(nonempty)
if __name__ == "__main__":
sample = Path("data.csv")
sample.write_text("a,b\n\n c,d\n", encoding="utf-8")
for row in pipeline(sample):
print(row)Lo que esto demuestra:
yield suspende - Guarda las variables locales del frame; se reanuda en next().StopIteration - Se eleva cuando el generador retorna o se cae del final.yield from - Delega a un sub-iterador (ver artículo dedicado)..gi_frame contiene el punto de ejecución (depuración).| Enfoque | Memoria |
|---|---|
list(process()) | O(n) todos los elementos |
| pipeline de generador | O(1) estado por etapa |
# expresión generadora
total = sum(x * x for x in range(1_000_000))
# cerrar generador temprano
gen = squares(100)
next(gen)
gen.close() # eleva GeneratorExit dentrowith en el generador - Si el consumidor se detiene temprano, el archivo puede permanecer abierto hasta el GC. Solución: contextlib.closing o try/finally en el generador.None.gen.send(None) para mayor claridad en la documentación.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Comprensión de listas | n pequeño, se necesita reutilización | Streams grandes |
itertools | Operaciones de iterador estándar | Lógica de dominio personalizada por elemento |
| Generador asíncrono | Streams de E/S asíncronos | Lecturas de archivos síncronas |
| Iterador de fragmentos de pandas | Lotes tabulares | Análisis simple de líneas |
Generador perezoso de un solo paso. Lista almacena todos los elementos para reutilización e indexación.
Delega la iteración a otro iterable; aplana generadores anidados eficientemente.
return value establece StopIteration.value (PEP 380); se consume a través de yield from, raramente se necesita solo.
Comunicación estilo corutina hacia el generador; avanzado; asyncio usa ideas similares.
gen.close() activa GeneratorExit en el punto de yield; limpiar recursos en try/finally en el generador.
Inyecta una excepción en el punto de yield; patrones de prueba y corutinas.
Generator[YieldType, SendType, ReturnType] para tipado avanzado; a menudo Iterator[T] es suficiente.
Patrón normal; cada yield produce un paso del consumidor.
Los generadores ahorran memoria; las listas pueden ser más rápidas para secuencias muy pequeñas debido a la sobrecarga.
itertools.tee divide un iterador en dos iteradores cacheados; el costo de memoria aumenta.
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 19 jul 2026