IOKELU
Nivel: Avanzado – Guía 4
💡 Prueba el código:
Puedes ejecutar cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →

Iteradores avanzados en Python

Los iteradores permiten recorrer estructuras de datos de forma controlada y eficiente. En esta guía aprenderás a crear iteradores personalizados, implementar el protocolo completo, usar iteradores infinitos, combinarlos con generadores y aplicar patrones profesionales usados en procesamiento de streams y estructuras complejas.

Tabla de contenidos

  • El protocolo de iteración
  • Iteradores personalizados
  • Iteradores infinitos
  • Iteradores reversibles
  • Iteradores encadenados
  • Itertools avanzado
  • Ejercicios
  • Mini‑proyecto

1. El protocolo de iteración

Un iterador debe implementar dos métodos:

class Contador:
    def __init__(self, limite):
        self.limite = limite
        self.actual = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.actual >= self.limite:
            raise StopIteration
        valor = self.actual
        self.actual += 1
        return valor

for n in Contador(5):
    print(n)

2. Iteradores personalizados

class Repetidor:
    def __init__(self, valor, veces):
        self.valor = valor
        self.veces = veces
        self.contador = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.contador >= self.veces:
            raise StopIteration
        self.contador += 1
        return self.valor

for x in Repetidor("Hola", 3):
    print(x)

3. Iteradores infinitos

class Infinitos:
    def __iter__(self):
        return self

    def __next__(self):
        return 1  # siempre devuelve algo

gen = Infinitos()
print(next(gen))
print(next(gen))

4. Iteradores reversibles

class Reverso:
    def __init__(self, datos):
        self.datos = datos

    def __iter__(self):
        return iter(self.datos)

    def __reversed__(self):
        return iter(self.datos[::-1])

r = Reverso([1,2,3])
print(list(r))
print(list(reversed(r)))

5. Iteradores encadenados

class Encadenado:
    def __init__(self, *iterables):
        self.iterables = iterables

    def __iter__(self):
        for it in self.iterables:
            for x in it:
                yield x

print(list(Encadenado([1,2], [3,4], [5])))

6. Itertools avanzado

import itertools

print(list(itertools.chain([1,2], [3,4])))
print(list(itertools.accumulate([1,2,3,4])))
print(list(itertools.takewhile(lambda x: x < 5, [1,2,3,6,7])))
print(list(itertools.product([1,2], ["a","b"])))

7. Ejercicios

8. Mini‑proyecto: Iterador de logs con filtros

class LogIterator:
    def __init__(self, ruta, palabra):
        self.ruta = ruta
        self.palabra = palabra

    def __iter__(self):
        with open(self.ruta) as f:
            for linea in f:
                if self.palabra in linea:
                    yield linea.strip()

for linea in LogIterator("logs.txt", "ERROR"):
    print(">>", linea)

Siguiente guía

Context managers avanzados →