Iteradores em Python

Iteradores em Python

Este artigo explica os iteradores em Python.

YouTube Video

Iteradores em Python

Visão geral

Em Python, um iterador é um mecanismo fundamental para processar elementos de coleções como listas, tuplas e dicionários um de cada vez.

O que é um Iterador?

Um iterador é um objeto que pode retornar elementos um de cada vez. Em Python, um objeto é considerado um iterador se atender às seguintes duas condições:.

  • Possui um método __iter__() que retorna ele mesmo.
  • Possui um método __next__() que retorna o próximo elemento. Gera uma exceção StopIteration quando não há mais elementos.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • Neste código, a função iter() é usada para converter uma lista em um iterador, e a função next() é usada para obter e exibir cada elemento um por um.

Diferença de Iterable (iterável)

Um iterável é um objeto que implementa o método __iter__() e pode ser usado em um laço for. Listas e tuplas são exemplos de iteráveis.

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • Este código é um exemplo de como obter um iterador de um iterável como uma lista e recuperar os elementos em ordem usando o next().

Como verificar:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • Este código confirma que nums é um iterável, mas não um iterador, enquanto it, obtido usando iter(nums), é um iterador.

Relação entre laços for e iteradores

Um laço for em Python funciona internamente da seguinte maneira:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • Como mostrado, o laço for utiliza implicitamente um iterador para realizar a iteração.

Criando um Iterador Personalizado

Você pode criar um iterador personalizado usando uma classe.

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • Este código define um iterador personalizado que faz a contagem regressiva usando a classe Countdown e imprime os números de 3 a 1 usando um loop for.

Diferença entre Iteradores e Geradores, e quando usar cada um

Geradores oferecem funcionalidades semelhantes aos iteradores. Eles permitem que você defina iteradores de forma mais concisa.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • Este código define uma função geradora que faz a contagem regressiva usando yield e imprime os números de 3 a 1 usando um loop for.

Diferenças entre Iteradores (Classe) e Geradores (Função)

Há as seguintes diferenças entre iteradores (classes) e geradores (funções):.

Recurso Iterador (classe) Gerador (função)
Definição __iter__() + __next__() Função usando yield
Gerenciamento de estado Manipulação manual de atributos necessária Mantém o estado automaticamente
Legibilidade Pode ficar complexo Simples e claro
  • Diferença em como são definidos Um iterador é definido escrevendo manualmente dois métodos: __iter__() e __next__(). Por outro lado, um gerador é apenas uma função que usa a palavra-chave yield, tornando o código muito mais simples.

  • Diferença no gerenciamento de estado Com um iterador, você precisa gerenciar o estado atual e o progresso manualmente usando variáveis. Geradores, entretanto, retêm automaticamente seu estado internamente no Python, reduzindo o esforço manual.

  • Legibilidade do código Iteradores tendem a se tornar complexos porque exigem vários métodos e gerenciamento manual de estado. Por outro lado, geradores usam uma sintaxe simples, tornando-os mais fáceis de entender até mesmo para iniciantes.

Biblioteca padrão para usar iteradores: itertools

itertools, uma biblioteca padrão do Python, oferece ferramentas poderosas para trabalhar com iteradores.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • Ela também inclui várias outras funções como cycle, repeat, chain, islice e tee.

Casos de uso para iteradores

Os casos de uso para iteradores incluem o seguinte:.

  • Processar linhas de arquivos: Ler linhas uma por uma de um arquivo como um iterador.
  • Processamento eficiente em memória: Processar grandes volumes de dados sequencialmente.
  • Representar sequências infinitas: Use funções como itertools.count().

Resumo

  • Um iterador é um objeto que pode obter o próximo valor sequencialmente.
  • Você pode criar um iterador personalizado definindo os métodos __iter__() e __next__().
  • Eles são processados automaticamente através de laços for ou da função next().
  • Usar geradores ou itertools possibilita um processamento mais eficiente.

Ao usar iteradores, você pode processar grandes volumes de dados sequencialmente de forma eficiente em memória, permitindo o gerenciamento controlado de estado e o melhor desempenho do programa.

Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.

YouTube Video