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çãoStopIteration
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çãonext()
é 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, enquantoit
, obtido usandoiter(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 loopfor
.
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 loopfor
.
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-chaveyield
, 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
etee
.
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çãonext()
. - 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.