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:
- __iter__(): devuelve el iterador
- __next__(): devuelve el siguiente valor o lanza StopIteration
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
- Crea un iterador que recorra una lista en pasos de 2.
- Crea un iterador que devuelva números primos.
- Crea un iterador infinito que genere Fibonacci.
- Crea un iterador reversible sin usar slicing.
- Implementa tu propia versión de itertools.chain.
class Saltos2:
def __init__(self, datos):
self.datos = datos
self.i = 0
def __iter__(self): return self
def __next__(self):
if self.i >= len(self.datos):
raise StopIteration
val = self.datos[self.i]
self.i += 2
return val
# Fibonacci infinito
class Fib:
def __iter__(self): return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
return self.a
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)