Iterador de Python

Iterador de Python

Un iterador es un objeto que contiene un número contable de valores.

Un iterador es un objeto iterable, lo que significa que puedes recorrer todos los valores.

Técnicamente, en Python, un iterador es un objeto que implementa el protocolo de iterador, que contiene métodos __iter__() y __next__().

Iterador VS Objeto Iterable (Iterable)

Las listas, tuplas, diccionarios y conjuntos son objetos iterables. Son contenedores iterables de los que puedes obtener un iterador (Iterator).

Todos estos objetos tienen métodos para obtener iteradores iter() Método:

Ejemplo

Devolver un iterador desde una tupla e imprimir cada valor:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Ejecutar Ejemplo

Incluso las cadenas de caracteres son objetos iterables y pueden devolver un iterador:

Ejemplo

Las cadenas de caracteres también son objetos iterables que contienen una serie 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))

Ejecutar Ejemplo

Recorrer iterador

También podemos usar un bucle for para recorrer objetos iterables:

Ejemplo

Iterar sobre los valores de una tupla:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Ejecutar Ejemplo

Ejemplo

Iterar sobre los caracteres de una cadena:

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

Ejecutar Ejemplo

Consejo:El bucle for en realidad crea un objeto iterador y ejecuta para cada ejecución del bucle next() método.

Crear iterador

Para crear un objeto/clase como iterador, es necesario implementar para el objeto __iter__() y __next__() método.

Como aprendiste en el capítulo de Clases/Objetos de Python, todas las clases tienen un método llamado __init__() La función, que le permite realizar algunas inicializaciones al crear un objeto.

__iter__() El método tiene un propósito similar, puede realizar operaciones (inicialización, etc.) pero debe devolver siempre el objeto iterador en sí.

__next__() El método también le permite realizar operaciones y debe devolver el siguiente elemento de la secuencia.

Ejemplo

Crear un iterador que devuelva números, comenzando en 1 y aumentando 1 en cada secuencia (devuelve 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))

Ejecutar Ejemplo

StopIteration

Si tienes suficiente next() instrucción, o en un bucle for, el ejemplo anterior continuará para siempre.

Para evitar que la iteración continúe para siempre, podemos usar StopIteration instrucción.

en __next__() En el método, si se completa el número especificado de iteraciones, podemos agregar una condición de terminación para lanzar un error:

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)

Ejecutar Ejemplo