Iteradores y Generadores: Eficiencia de Memoria
En Python, no siempre es buena idea cargar todos los datos en una lista. Si tienes un millón de registros, una lista consumirá mucha memoria RAM. Los Iteradores y Generadores te permiten procesar datos de uno en uno, solo cuando los necesitas.
1. ¿Qué es un Iterador?
Un objeto es iterable si puedes recorrerlo (como una lista). Un Iterador es el objeto que realmente hace el trabajo de recorrerlo, manteniendo un puntero a la posición actual.
Se basa en dos métodos fundamentales:
1. __iter__(): Devuelve el objeto iterador.
2. __next__(): Devuelve el siguiente elemento. Cuando no hay más, lanza la excepción StopIteration.
2. Generadores: El poder de yield
Un Generador es una función especial que devuelve un iterador. En lugar de usar return (que termina la función), usa yield.
Cuando una función usa yield, Python "congela" el estado de la función y devuelve el valor. La próxima vez que se llame, la función se reanuda exactamente donde se quedó.
Ventajas de los Generadores:
- Ahorro de memoria: No guardan la lista completa, solo calculan el siguiente valor.
- Flujos infinitos: Puedes representar secuencias que nunca terminan (como números primos).
3. Expresiones Generadoras
Al igual que las List Comprehensions, puedes crear generadores en una sola línea usando paréntesis en lugar de corchetes:
- Lista:
[x*x for x in range(1000)](Ocupa memoria para 1000 elementos). - Generador:
(x*x for x in range(1000))(Solo ocupa memoria para la fórmula).
Reto: El Generador de Números Pares
Vamos a crear un generador profesional que produzca números pares hasta un límite establecido.
Instrucciones:
- Crea una función generadora llamada
generador_pares(limite). - Usa un bucle
whileoforpara encontrar números pares. - Usa
yieldpara devolver cada número par encontrado. - Fuera de la función, crea un objeto llamado
mi_generadorllamando a tu función con un límite de10. - Convierte el generador en una lista llamada
resultadopara verificar los valores.
# Crea tu primer generador: