PYTHON ITERADORES

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 consiste en los métodos __iter __ () y __next __ ().

Iterador vs Iterable Listas, tuplas, diccionarios y conjuntos son todos objetos iterables.

Son contenedores iterables de los que puedes obtener un iterador. Todos estos objetos tienen un método iter () que se usa para obtener un iterador:

Ejemplo

Devuelva un iterador desde una tupla e imprima cada valor:

 mytuple = ("rojo", "amarillo", "azul")
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 = "rojo"
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 bucle for para iterar a través de un objeto iterable:

Ejemplo

Iterar los valores de una tupla:

mytuple = ("rojo","amarillo","azul")
for x in mytuple:
print(x)

Ejemplo

Iterar los caracteres de una cadena:

mystr = "rojo"
for x in mystr:
print(x)

El bucle for realmente se crea en el 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 __siguiente __ () a 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 método __iter __ () actúa de manera similar, puede realizar operaciones (inicializar, etc.), pero siempre debe devolver el objeto iterador. El método __siguiente __ () 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 Numeros:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x

myclass = Numeros()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Cómo parar la Iteración: StopIteration

El ejemplo anterior continuaría para siempre si tuviera suficientes instrucciones next () o si se usara en un bucle for. Para evitar que la iteración continúe para siempre, podemos usar la declaración StopIteration. En el método __siguiente __ (), 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 10 iteraciones:

Class Numeros:
  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)