Diccionario

Iterador

Un objeto que entrega los elementos de una colección uno a uno, cuando se le piden.

Un iterador recorre una colección paso a paso: cada vez que se le pide, entrega el siguiente elemento, hasta que no quedan más. Los bucles for de casi todos los lenguajes usan iteradores por dentro.

Muchos son «perezosos»: no calculan nada hasta que hace falta. Así se pueden recorrer archivos enormes o secuencias muy largas sin cargarlas enteras en memoria, como hacen los generadores de Python (yield) o los iteradores de Rust (iter().map().filter()).

Un ejemplo

En Python, for linea in open("registro.log") lee el archivo línea a línea sin cargarlo entero en memoria.

Por qué importa

Un iterador es un objeto que te entrega los elementos de una colección de uno en uno, recordando por dónde va, sin que tengas que conocer cómo está organizada por dentro. Gracias a ello, el mismo bucle sirve para recorrer una lista, un conjunto, un diccionario, las líneas de un archivo o incluso una secuencia que se calcula sobre la marcha. Es el mecanismo que hay detrás del bucle for ... in de Python, el for...of de JavaScript o el foreach de C# y Java.

Su gran ventaja es la evaluación perezosa: el siguiente elemento solo se genera cuando se pide. Eso permite trabajar con secuencias enormes o infinitas sin cargarlas enteras en memoria, como leer un archivo de varios gigabytes línea a línea. En Python se pueden crear con generadores usando yield, y en JavaScript con funciones generadoras (function*). Conocer el concepto te ayuda a escribir código más eficiente y a entender mensajes como «objeto no iterable».

Confusiones frecuentes

Se confunde iterable con iterador. Un iterable es algo que puede recorrerse, como una lista; el iterador es el objeto que lleva la cuenta del recorrido sobre él. En Python, iter(lista) devuelve un iterador y next() pide el siguiente elemento. Otro error de principiante es esperar poder recorrer dos veces el mismo iterador: una vez agotado, no devuelve más elementos, a diferencia de la lista, que es reutilizable. Y modificar una colección mientras la recorres con un iterador suele dar errores o resultados inesperados; es mejor construir una nueva o recorrer una copia.

Preguntas frecuentes

¿Por qué mi generador devuelve vacío la segunda vez?

Porque los generadores e iteradores se consumen al recorrerlos. Para volver a usarlos hay que crear uno nuevo o convertir el resultado en una lista.

¿Qué hace `yield` en Python?

Convierte la función en un generador: devuelve un valor, pausa la ejecución y, en la siguiente petición, continúa desde ese punto. Así produce valores uno a uno.