Iteradores e o Protocolo de Iterador
A iteração está em toda parte em Python - loops for, compreensões, desempacotamento e sum. Objetos participam implementando o protocolo de iterador ou delegando para generators.
Busque em todas as páginas da documentação
A iteração está em toda parte em Python - loops for, compreensões, desempacotamento e sum. Objetos participam implementando o protocolo de iterador ou delegando para generators.
class Countdown:
def __init__(self, start: int) -> None:
self.current = start
def __iter__(self):
return self
def __next__(self) -> int:
if self.current < 0:
raise StopIteration
value = self.current
self.current -= 1
return value
for n in Countdown(3):
print(n)Quando usar isso:
itertools e loops forfrom collections.abc import Iterable, Iterator
class CSVLines:
def __init__(self, lines: Iterable[str]) -> None:
self._lines = iter(lines)
def __iter__(self) -> Iterator[list[str]]:
for raw in self._lines:
yield [cell.strip() for cell in raw.split(",")]
def take(iterator: Iterator[int], n: int) -> list[int]:
result: list[int] = []
for _ in range(n):
try:
result.append(next(iterator))
except StopIteration:
break
return result
if __name__ == "__main__":
rows = CSVLines(["a,b", "c,d"])
for row in rows:
print(row)
print(take(iter(range(10)), 3))O que isso demonstra:
__iter__ (generator é um iterator)iter() obtém um iterator; next() puxa itens até StopIterationtake consome manualmente um iterator com leitura limitada__iter__ retornando um iterator.__iter__ (retorna self) e __next__.for.yield constrói um iterator automaticamente.| Objeto | Métodos Requeridos |
|---|---|
| Iterable | __iter__ |
| Iterator | __iter__, __next__ |
# iter com sentinel para blocos binários
with open("data.bin", "rb") as fh:
for chunk in iter(lambda: fh.read(4096), b""):
process(chunk)for. Correção: Chame iter() novamente apenas em iteráveis.return puro; em __next__ levante StopIteration.__iter__.take/islice.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Função generator | Maioria das iterações customizadas | Necessita de estado de classe além do yield |
itertools | Álgebra padrão de iteradores | Loop simples único |
Materializar list | Necessita de reutilização/acesso aleatório | Streams muito grandes |
| Iterator assíncrono | async for com I/O | Pipeline apenas síncrono |
Iterable produz iterators. Iterator produz itens uma vez até se esgotar.
Sinaliza o fim da iteração para a maquinaria do loop for - não é para controle de fluxo geral no código da aplicação.
Somente se o objeto for iterável, retornando um novo iterator a cada chamada de iter(). Generators se esgotam após uma passagem.
it = iter(obj); while True: try: x = next(it) ... except StopIteration: break
Chama repetidamente callable até sentinel - útil para leituras de stream.
Verificação de instância estrutural - classes customizadas podem se registrar ou implementar __iter__.
Generators são mais rápidos de escrever; classes quando estado complexo ou múltiplos métodos são necessários.
Built-ins retornam iterators - consomem uma vez, eficientes em memória.
__aiter__/__anext__ com async for - veja a seção asyncio.
list(iterator) materializa o esperado; afirma StopIteration em chamadas next extras.
Versões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026