Iteradores y Generadores en Python: Uso Eficiente de Memoria

Clase 17 de 63Curso de Python

Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Conceptos avanzados de Python

Métodos y estructura de clases en Python

Resumen

Trabajar con grandes volúmenes de datos exige estrategias que cuiden la memoria. En Python, los iteradores y generadores permiten recorrer colecciones elemento por elemento, sin cargar todo el conjunto de datos al mismo tiempo. Comprender estas herramientas marca la diferencia entre un código funcional y uno verdaderamente eficiente.

¿Cómo funciona un iterador en Python?

Un iterador es un objeto que recorre los elementos de una colección sin usar índices. Se crea con la función iter() y se avanza con next() [00:18].

python

Crear una lista

lista = [1, 2, 3, 4]

Obtener el iterador

iterador = iter(lista)

Usar el iterador

print(next(iterador)) # 1 print(next(iterador)) # 2 print(next(iterador)) # 3 print(next(iterador)) # 4

Cada llamada a next() devuelve el siguiente valor almacenado en el iterador. Cuando se agotan los elementos y se intenta obtener uno más, Python lanza una excepción StopIteration [01:20]. Esto significa que, una vez consumido, el iterador no puede rebobinarse: no hay forma de volver atrás.

¿Se puede iterar sobre cadenas de texto?

Las cadenas también son iterables. Basta con pasar la variable de texto a iter() y luego recorrerla con un for [01:42].

python texto = "hola mundo" iterador = iter(texto)

for caracter in iterador: print(caracter)

El resultado imprime cada carácter por separado: h, o, l, a, espacio, m, u, n, d, o. Esta técnica es útil cuando necesitas procesar texto carácter por carácter.

¿Cómo generar números impares con range e iteradores?

La función range() acepta tres argumentos: inicio, fin y paso [02:22]. Combinándola con iter() se obtiene un iterador que produce solo los valores deseados.

python limite = 10 iterador = iter(range(1, limite + 1, 2))

for numero in iterador: print(numero)

Salida: 1, 3, 5, 7, 9

  • El inicio es 1 porque el primer número impar es uno.
  • El fin es limite + 1 para que el rango incluya el propio límite.
  • El paso es 2, lo que hace que salte de dos en dos.

Si cambias el inicio a 0, obtienes los números pares: 0, 2, 4, 6, 8, 10 [03:10].

¿Qué es un generador y en qué se diferencia de un iterador?

Un generador es una función que produce una secuencia de valores usando la palabra reservada yield en lugar de return [03:30]. Cada vez que el flujo llega a yield, la función pausa su ejecución, entrega el valor y recuerda su estado para continuar después.

python def mi_generador(): yield 1 yield 2 yield 3

for valor in mi_generador(): print(valor)

Salida: 1, 2, 3

La diferencia principal es que el generador crea los valores sobre la marcha, mientras que un iterador convencional necesita que la colección ya exista en memoria.

¿Cómo implementar la serie de Fibonacci con un generador?

La serie de Fibonacci se construye sumando los dos valores anteriores para obtener el siguiente: 0, 1, 1, 2, 3, 5, 8, 13… [04:08]. Un generador es ideal porque produce cada número solo cuando se solicita.

python def fibonacci(limite): a, b = 0, 1 while a < limite: yield a a, b = b, a + b

for numero in fibonacci(10): print(numero)

Salida: 0, 1, 1, 2, 3, 5, 8

  • Las variables a y b se inicializan en 0 y 1 mediante asignación múltiple en una sola línea.
  • El bucle while a < limite controla hasta dónde crece la sucesión.
  • En cada iteración, yield a devuelve el valor actual y luego a, b = b, a + b actualiza ambas variables simultáneamente.

Con un límite de 10, la serie se detiene en 8 porque el siguiente valor sería 13, que supera el límite [05:15].

¿Cuándo elegir un iterador o un generador?

  • Usa iteradores cuando ya tienes una colección y quieres recorrerla sin índices.
  • Usa generadores cuando necesitas producir valores bajo demanda, especialmente en secuencias largas o infinitas donde almacenar todo en memoria sería inviable.

Ambas herramientas comparten el protocolo de iteración de Python, por lo que se integran de forma natural con bucles for y otras estructuras del lenguaje.

Ahora es tu turno: crea generadores que devuelvan los números pares e impares y comparte tu solución en los comentarios.