Python Iteradores
Iteradores de Python
Un iterador es un objeto que contiene un número contable de valores.
Un iterador es un objeto sobre el que se puede iterar, lo que significa que se pueden recorrer todos los valores.
Técnicamente, en Python, un iterador es un objeto que implementa el protocolo del iterador, que consta de los métodos __iter__()
and __next__()
.
Iterador vs Iterable
Las listas, tuplas, diccionarios y conjuntos son todos objetos iterables. Son contenedores iterables de los que puede obtener un iterador.
Todos estos objetos tienen un método iter()
que se utiliza para obtener un iterador:
Ejemplo
Devuelve un iterador de una tupla e imprime cada valor:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Inténtalo tú mismo »
Incluso las cadenas son objetos iterables y pueden devolver un iterador:
Ejemplo
Las cadenas también son objetos iterables y contienen una secuencia de caracteres:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Inténtalo tú mismo »
Recorriendo un iterador
También podemos usar un bucle for
para iterar a través de un objeto iterable:
Ejemplo
Iterar los valores de una tupla:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Inténtalo tú mismo »
Ejemplo
Iterar los caracteres de una cadena:
mystr = "banana"
for x in mystr:
print(x)
Inténtalo tú mismo »
El bucle for
en realidad crea un objeto iterador y ejecuta el método next() para cada bucle.
Crear un iterador
Para crear un objeto/clase como iterador, debe implementar los métodos __iter__()
y __next__()
a tu objeto.
Como has aprendido en el capítulo Clases/Objetos de Python, todas las clases tienen una función llamada __init__()
, que le permite realizar algunas inicializaciones cuando se crea el objeto.
El método __iter__()
actúa de manera similar, puede realizar operaciones (inicialización, etc.), pero siempre debe devolver el objeto iterador en sí.
El método __next__()
también le permite realizar operaciones y debe devolver el siguiente elemento de la secuencia.
Ejemplo
Cree un iterador que devuelva números, comenzando con 1, y cada secuencia aumentará en uno (devolviendo 1,2,3,4,5, etc.):
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
Inténtalo tú mismo »
StopIteration / Detener iteración
El ejemplo anterior continuaría para siempre si tuviera suficientes declaraciones next() o si se usara en un bucle for
.
Para evitar que la iteración continúe eternamente, podemos usar la instrucción StopIteration
.
En el método __next__()
, podemos agregar una condición de terminación para generar un error si la iteración se realiza un número específico de veces:
Ejemplo
Detener después de 20 iteraciones:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
Inténtalo tú mismo »