Generators & yield
Funções geradoras usam yield para produzir um fluxo de valores de forma preguiçosa (lazy). Elas preservam o estado local entre as etapas - ideal para arquivos grandes, sequências infinitas e pipelines ETL.
Busque em todas as páginas da documentação
Funções geradoras usam yield para produzir um fluxo de valores de forma preguiçosa (lazy). Elas preservam o estado local entre as etapas - ideal para arquivos grandes, sequências infinitas e pipelines ETL.
def squares(n: int):
for i in range(n):
yield i * i
for value in squares(5):
print(value)Quando usar isso:
from pathlib import Path
def read_lines(path: Path):
with path.open(encoding="utf-8") as fh:
for line in fh:
yield line.rstrip("\n")
def filter_nonempty(lines):
for line in lines:
if line.strip():
yield line
def parse_csv_rows(lines):
for line in lines:
yield line.split(",")
def pipeline(path: Path):
lines = read_lines(path)
nonempty = filter_nonempty(lines)
return parse_csv_rows(nonempty)
if __name__ == "__main__":
sample = Path("data.csv")
sample.write_text("a,b\n\n c,d\n", encoding="utf-8")
for row in pipeline(sample):
print(row)O que isso demonstra:
yield suspende - Salva os locais do frame; retoma em next().yield from - Delega para um sub-iterador (veja artigo dedicado)..gi_frame contém o ponto de execução (depuração).| Abordagem | Memória |
|---|---|
list(process()) | O(n) todos os itens |
| pipeline de gerador | O(1) estado por estágio |
# generator expression
total = sum(x * x for x in range(1_000_000))
# fechar gerador cedo
gen = squares(100)
next(gen)
gen.close() # lança GeneratorExit internamentewith no gerador - Se o consumidor parar cedo, o arquivo pode permanecer aberto até a coleta pelo GC. Correção: contextlib.closing ou try/finally no gerador.None.gen.send(None) para clareza na documentação.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| List comprehension | n pequeno, precisa de reutilização | Fluxos grandes |
itertools | Operações padrão de iterador | Lógica de domínio personalizada por item |
| Gerador assíncrono | Fluxos de I/O assíncronos | Leituras de arquivo síncronas |
| Iterador de chunk do pandas | Lotes tabulares | Análise simples de linha |
Gerador preguiçoso de passagem única. Lista armazena todos os elementos para reutilização e indexação.
Delega a iteração para outro iterável - achata geradores aninhados eficientemente.
return value define StopIteration.value (PEP 380) - consumido via yield from, raramente necessário sozinho.
Comunicação estilo corrotina para dentro do gerador - avançado; asyncio usa ideias semelhantes.
gen.close() aciona GeneratorExit no ponto de yield - limpe recursos em try/finally no gerador.
Injeta exceção no ponto de yield - testes e padrões de corrotina.
Generator[YieldType, SendType, ReturnType] para tipagem avançada - muitas vezes Iterator[T] é suficiente.
Padrão normal - cada yield produz um passo do consumidor.
Geradores economizam memória; lista pode ser mais rápida para sequências minúsculas devido à sobrecarga.
itertools.tee divide um iterador em dois iteradores em buffer - o custo de memória aumenta.
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