Conceptos básicos de los generadores
¿Qué es un generador?
Un generador en Python es un tipo especial de función que devuelve un objeto iterador, lo que te permite generar una secuencia de valores a lo largo del tiempo, en lugar de calcularlos todos de una vez y almacenarlos en memoria. Los generadores proporcionan una forma eficiente en términos de memoria de trabajar con grandes conjuntos de datos o secuencias infinitas.
Creación de generadores
Funciones generadoras
Los generadores se crean utilizando la palabra clave yield
en lugar de return
. Cuando se llama a una función generadora, devuelve un objeto generador sin iniciar realmente la ejecución de la función.
def simple_generator():
yield 1
yield 2
yield 3
## Create generator object
gen = simple_generator()
Expresiones generadoras
Similar a las comprensiones de listas, las expresiones generadoras proporcionan una forma concisa de crear generadores:
## Generator expression
squared_gen = (x**2 for x in range(5))
Comportamiento de los generadores
Evaluación perezosa
Los generadores utilizan la evaluación perezosa, lo que significa que los valores se generan sobre la marcha:
graph LR
A[Generator Created] --> B[Value Generated Only When Requested]
B --> C[Next Value Generated on Next Iteration]
Mecanismo de iteración
Los generadores se pueden iterar utilizando next()
o en un bucle for
:
def countdown(n):
while n > 0:
yield n
n -= 1
## Iteration methods
for num in countdown(3):
print(num)
## Using next()
gen = countdown(3)
print(next(gen)) ## 3
print(next(gen)) ## 2
Características clave
Característica |
Descripción |
Eficiencia de memoria |
Genera valores uno a la vez |
Iteración |
Solo se puede iterar una vez |
Conservación de estado |
Recuerda su estado entre llamadas |
Casos de uso
- Trabajar con grandes conjuntos de datos
- Secuencias infinitas
- Procesamiento en tuberías (pipeline processing)
- Entornos con limitaciones de memoria
Técnicas avanzadas de generadores
Encadenamiento de generadores
def generator1():
yield from range(3)
def generator2():
yield from range(3, 6)
## Combining generators
combined = list(generator1()) + list(generator2())
print(combined) ## [0, 1, 2, 3, 4, 5]
Consideraciones de rendimiento
Los generadores son especialmente útiles en entornos LabEx donde la optimización de recursos es crucial. Proporcionan una alternativa ligera a los enfoques tradicionales basados en listas, especialmente cuando se trata de transformaciones de datos grandes o complejas.