Generadores
Un generador es una función que permite crear un iterador de una manera más eficiente, sin necesidad de almacenar toda la secuencia de valores en memoria. Los generadores utilizan la palabra clave yield para devolver valores uno a uno.
1. Cómo funcionan los generadores? #
En lugar de devolver un único valor como en una función normal con return, un generador usa yield para devolver un valor y luego pausa la ejecución de la función, de modo que cuando se solicita el siguiente valor, la ejecución continúa desde donde se quedó.
2. Ejemplo básico de generador: #
1def contar_hasta_tres(): 2 yield 1 3 yield 2 4 yield 3 5 6# Usando el generador 7contador = contar_hasta_tres() 8 9for numero in contador: 10 print(numero)Salida de consola 1 2 3
3. Ventajas de los generadores #
- Eficiencia en memoria: Los generadores no cargan toda la secuencia de datos en memoria, sino que generan cada valor a medida que es necesario.
- Pausas y reanudación: Un generador puede ser pausado en cualquier momento, y su estado es guardado. Se puede reanudar desde el último
yieldcuando sea necesario.
4. Generador infinito #
Un generador puede ser infinito, lo que significa que puede generar una secuencia de valores sin fin:
1def contar_infinito(): 2 num = 1 3 while True: 4 yield num 5 num += 1 6 7# Usando el generador infinito 8contador = contar_infinito() 9 10# Solo queremos imprimir los primeros 5 números 11for _ in range(5): 12 print(next(contador))Salida de consola 1 2 3 4 5
5. Usando generadores con next() #
El generador puede ser controlado usando la función next(), que devuelve el siguiente valor generado. Si el generador no tiene más valores que devolver, lanzará una excepción StopIteration.
1def contar_infinito(): 2 num = 1 3 while True: 4 yield num 5 num += 1 6 7gen = contar_infinito() 8print(next(gen)) # 1 9print(next(gen)) # 2Salida de consola 1 2
Resumen del tema
Conceptos clave #
- Funciones Generadoras: funciones que usan
yielden lugar dereturnpara producir secuencias de valores de forma diferida o perezosa (lazy evaluation). - Eficiencia de Memoria (): computan y entregan elementos bajo demanda sin cargar colecciones enteras en memoria RAM.
- Protocolo de Iteración: mantienen su estado interno entre llamadas sucesivas; se avanzan con
next(generador)o en buclesforhasta agotarse conStopIteration. - Expresiones Generadoras: sintaxis concisa similar a list comprehensions utilizando paréntesis
(x**2 for x in rango).
Qué debes recordar #
Los generadores producen secuencias diferidas mediante yield, optimizando el consumo de memoria al no almacenar la colección completa.