Iterador do Python

Iterador do Python

O iterador é um objeto que contém um número contável de valores.

O iterador é um objeto iterável, o que significa que você pode percorrer todos os valores.

Técnicamente, no Python, o iterador é um objeto que implementa o protocolo de iterador, que contém métodos __iter__() e __next__().

Iterador VS Objeto Iterável (Iterable)

listas, tuplas, dicionários e conjuntos são objetos iteráveis. Eles são contêineres iteráveis, a partir dos quais você pode obter iteradores (Iterator).

Todos esses objetos têm métodos para obter iteradores iter() Método:

Exemplo

Retornar um iterador do tupla e imprimir cada valor:

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

Executar Exemplo

Até mesmo as strings são objetos iteráveis e podem retornar iteradores:

Exemplo

As strings também são objetos iteráveis, contendo uma série 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))

Executar Exemplo

Percorrer iterador

Também podemos usar um loop for para percorrer objetos iteráveis:

Exemplo

Iterar sobre os valores do tupla:

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

Executar Exemplo

Exemplo

Iterar sobre os caracteres da string:

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

Executar Exemplo

Dica:O loop for cria um objeto iterador e executa next() método.

criar iterador

Para criar um objeto/classe como iterador, é necessário implementar o método __iter__() e __next__() método.

Como você aprendeu no capítulo de classes/objetos do Python, todas as classes têm um método chamado __init__() A função, que permite inicializar algumas coisas ao criar o objeto.

__iter__() O método tem uma função semelhante, você pode executar operações (inicialização, etc.) mas deve sempre retornar o objeto do iterador.

__next__() O método também permite que você execute operações e deve retornar o próximo item da sequência.

Exemplo

Criar um iterador que retorna números, começando em 1 e aumentando 1 em cada sequência (retorna 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))

Executar Exemplo

StopIteration

Se você tiver next() instrução, ou no loop for, o exemplo acima continuaria para sempre.

Para evitar que a iteração continue para sempre, podemos usar StopIteration instrução.

em __next__() Dentro de um método, se a iteração for completada o número especificado de vezes, podemos adicionar uma condição de parada para lançar um erro:

Exemplo

Parar após 20 iterações:

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)

Executar Exemplo