Iteradores de Python
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 puede 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__()
y __next__()
.
Iterador vs Iterable
Las listas, las tuplas, los diccionarios y los conjuntos son todos objetos iterables. Son contenedores iterables de los que puede obtener un iterador.
Todos estos objetos tienen un iter()
método 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))
Incluso las cadenas son objetos iterables y pueden devolver un iterador:
Ejemplo
Las cadenas también son objetos iterables, que 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))
Bucle a través de un iterador
También podemos usar un for
bucle 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)
Ejemplo
Iterar los caracteres de una cadena:
mystr = "banana"
for x in mystr:
print(x)
El for
bucle en realidad crea un objeto iterador y ejecuta el método next() para cada bucle.
Crear un iterador
Para crear un objeto/clase como un iterador, debe implementar los métodos
__iter__()
y
__next__()
su objeto.
Como aprendió 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 __iter__()
método actúa de manera similar, puede realizar operaciones (inicialización, etc.), pero siempre debe devolver el objeto iterador en sí.
El __next__()
método 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))
Detener iteración
El ejemplo anterior continuaría para siempre si tuviera suficientes instrucciones next(), o si se usara en un
for
bucle.
Para evitar que la iteración continúe para siempre, podemos usar la
StopIteration
declaración.
En el __next__()
método, podemos agregar una condición de terminación para generar un error si la iteración se realiza una cantidad específica 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)