Iteradores en Python: Concepto, Uso y Características

Un iterador en Python es un objeto que permite recorrer los elementos de una colección secuencialmente, uno a la vez. El ejemplo más común de su uso es la sentencia for.

for elemento in coleccion:
    # Código a ejecutar
    pass

Objetos Iterables

Un objeto iterable es aquel sobre el cual se puede iterar usando un bucle for. Ejemplos comunes incluyen cadenas (str), listas (list), tuplas (tuple), diccionarios (dict), conjuntos (set), objetos de archivo (open()), objetos generador y el objeto range. Generalmente, los tipos de contenedor son iterables, mientras que los tipos simples como números enteros no lo son.

iterador = iter("¡Hola!")
print(iterador)
# Salida: <str_iterator object at 0x...>

Objetos No Iterables

Los tipos de datos que no admiten la iteración directa suelen ser aquellos que no contienen múltiples elementos. Por ejemplo:

  • Números enteros y flotantes:
for digito in 12345:
    print(digito)
# TypeError: 'int' object is not iterable
  1. Valores booleanos (bool).
  2. NoneType (el objeto None).

Protocolo del Iterador

Un iterador es un objeto que implementa el protocolo de iteración, el cual requiere dos métodos especiales: __iter__() y __next__(). El método __iter__() debe retornar el propio objeto iterador, y __next__() retorna el siguiente elemento de la secuencia.

Se puede obtener un iterador mediante la función integrada iter() o invocando el método __iter__() de un iterable. Para obtener el siguiente valor, se utiliza la función next() o el método __next__().

cadena = "Python"
secuencia = iter(cadena)   # Equivalente a cadena.__iter__()

print(next(secuencia))      # Salida: P
print(secuencia.__next__()) # Salida: y
print(next(secuencia))      # Salida: t

Simulación del Bucle for

Internamente, un bucle for obtiene un iterador del objeto iterable y llama repetidamente a __next__() hasta que se captura la excepción StopIteration.

datos = [10, 20, 30]
iterador_datos = datos.__iter__()

while True:
    try:
        valor = iterador_datos.__next__()
        print(valor * 2)  # Cuerpo del bucle
    except StopIteration:
        break

Propiedades Clave de los Iteradores

  1. Dirección única: Solo avanzan hacia adelante. No es posible retroceder ni reiniciar sin crear un nuevo iterador.
  2. Un solo uso: Una vez que todos los elementos han sido consumidos, el iterador queda agotado. Lanzará StopIteration en cualquier intento posterior de obtener un valor.
  3. Eficiencia en memoria: Cargan un solo elemento a la vez, permitiendo procesar secuencias de tamaño potencialmente infinito con un uso mínimo de memoria.
  4. Evaluación perezosa (lazy): Los valores se generan bajo demanda solo cuando se solicitan mediante next().
secuencia = iter("ABC")
print(next(secuencia))  # A
print(next(secuencia))  # B
print(next(secuencia))  # C
# La siguiente línea generaría StopIteration
# print(next(secuencia))

Iterabilidad del Iterador

Todo objeto iterador es también, por definición, un iterable. Esto signfiica que puede pasarse directamente a un bucle for o a la función iter(), que simplemente retornará el mismo iterador.

mi_iterador = iter(["x", "y", "z"])

for letra in mi_iterador:
    print(letra)
# Salida:
# x
# y
# z

Etiquetas: Python iteradores iterables protocolo_iteración generadores

Publicado el 6-25 20:45