Saltar a contenido

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:

  1. Crea una función generadora llamada generador_pares(limite).
  2. Usa un bucle while o for para encontrar números pares.
  3. Usa yield para devolver cada número par encontrado.
  4. Fuera de la función, crea un objeto llamado mi_generador llamando a tu función con un límite de 10.
  5. Convierte el generador en una lista llamada resultado para verificar los valores.

# Crea tu primer generador: