Módulo 13 - Geradores e iteradores

Generator expressions

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Escrever uma generator expression com parênteses.
  • Diferenciar uma generator expression de uma compreensão de lista.
  • Saber quando preferir a generator expression à lista.
  • Passar uma generator expression direto para funções como sum e max.

Troque o colchete pelo parêntese

No módulo de compreensões você aprendeu a escrever [x * x for x in numeros] e transformar três linhas de laço em uma só. A generator expression é a irmã preguiçosa dessa sintaxe, e a mudança é quase invisível: troque os colchetes por parênteses. O resultado deixa de ser uma lista pronta e passa a ser um gerador, com todos os benefícios das aulas anteriores. Mesma legibilidade, mesma clareza de intenção, mas sem materializar a coleção inteira. É o jeito mais rápido e comum de criar um gerador no Python do dia a dia, sem precisar escrever uma função com yield.

numeros = [1, 2, 3, 4, 5]

lista = [n * n for n in numeros]     # compreensao de lista
gerador = (n * n for n in numeros)   # generator expression

print(lista)              # [1, 4, 9, 16, 25]
print(gerador)            # <generator object <genexpr> at 0x...>
print(list(gerador))      # [1, 4, 9, 16, 25]

Colchetes constroem a lista na hora; parênteses criam um gerador que produz sob demanda.

A diferença é a mesma da aula anterior: a versão com colchetes calcula os cinco quadrados de imediato e os guarda; a versão com parênteses cria um gerador que só calcula cada quadrado quando você o pede. Como o gerador se esgota depois de percorrido, imprimir gerador direto mostra apenas o objeto, e envolvê-lo em list() o consome de uma vez. Para cinco itens, prefira a lista, que é mais simples de reusar. O ganho aparece quando os itens são muitos, ou quando você só vai passar por eles uma vez.

Quando preferir cada uma

A regra prática é direta. Use a compreensão de lista quando você precisa da lista de verdade: para percorrer mais de uma vez, ordenar, contar o len, acessar por índice ou guardar para depois. Use a generator expression quando os dados serão consumidos uma única vez, em fluxo, especialmente se forem muitos. O caso mais elegante é passar a generator expression direto para uma função que consome um iterável, como sum, max, min, any ou all. Nesses casos você nem precisa dos parênteses extras, porque os da própria chamada da função bastam.

precos = [19.90, 5.50, 42.00, 8.75, 100.00]

# Soma sem criar lista intermediaria: a generator expression
# alimenta o sum() item por item.
total = sum(preco for preco in precos if preco > 10)
print(total)          # 161.9

# Maior preco acima de 10, tambem sem lista intermediaria.
maior = max(preco for preco in precos if preco > 10)
print(maior)          # 100.0

Passar a generator expression direto para sum e max evita construir uma lista só para descartá-la.

Prefira lista [ ]

  • Vai percorrer a coleção mais de uma vez
  • Precisa ordenar, contar len ou fatiar
  • Precisa acessar itens por índice
  • A coleção é pequena e será reusada

Prefira gerador ( )

  • Vai percorrer os itens uma única vez
  • A coleção é muito grande ou infinita
  • Vai passar direto para sum, max, any
  • Quer economizar memória em um fluxo

Um detalhe de leitura ajuda a escolher com confiança. Se você se pega escrevendo sum([x for x in dados]), quase sempre pode remover os colchetes de dentro e escrever sum(x for x in dados). A versão com colchetes constrói uma lista inteira só para o sum consumi-la e jogá-la fora em seguida, um desperdício de memória. A versão sem colchetes alimenta o sum diretamente, item por item. É uma daquelas trocas pequenas que deixam o código mais pythônico sem custo nenhum de clareza.

Fixando a escolha

A generator expression é a forma mais leve de trazer a preguiça dos geradores para o código do dia a dia. Ela tem a mesma cara da compreensão de lista, então não custa nada a mais para ler, e entrega a economia de memória quando os dados são muitos ou passageiros. Guardar a diferença de um caractere, colchete contra parêntese, e o que ela significa, é o que permite escolher a estrutura certa quase no automático. Na próxima aula você vai ver como conectar várias generator expressions e funções geradoras em sequência, formando pipelines de dados.

Teste rápido

Qual a diferença entre [x for x in dados] e (x for x in dados)?

Perguntas frequentes

Uma generator expression cria uma tupla, já que usa parênteses?
Não. Apesar dos parênteses, ela cria um gerador, não uma tupla. O Python não tem compreensão de tupla com essa sintaxe. Se você quer uma tupla a partir de uma compreensão, envolva a generator expression com tuple(), como tuple(x for x in dados).
Posso usar if e for aninhado numa generator expression?
Sim. A sintaxe é a mesma da compreensão de lista, incluindo filtros com if e laços aninhados. Só troca a economia de memória: os itens saem sob demanda em vez de virarem uma lista pronta. Mantenha a expressão simples; se ela ficar difícil de ler, uma função geradora com yield pode ser mais clara.
Quando devo remover os colchetes de dentro de sum([...])?
Quase sempre. sum([x for x in dados]) constrói uma lista só para o sum consumi-la e descartá-la. Escreva sum(x for x in dados) para alimentar o sum diretamente, item por item, sem a lista intermediária. Vale o mesmo para max, min, any, all e outras funções que consomem um iterável.
A generator expression é reutilizável depois de usada?
Não. Como todo gerador, ela se esgota depois de percorrida uma vez. Se precisar dos itens de novo, ou você guarda numa lista, ou recria a expressão. Essa é justamente a diferença de comportamento frente à compreensão de lista, que pode ser reusada à vontade.
Vale a pena usar generator expression para poucos itens?
Em geral não muda muito. Para coleções pequenas que você vai reusar, a lista costuma ser mais simples e prática. A generator expression compensa quando a coleção é grande, quando os itens só serão percorridos uma vez ou quando você passa a expressão direto para uma função como sum.
Dá para nomear uma generator expression numa variável?
Dá: g = (x * x for x in dados) guarda o gerador na variável g, que você percorre depois com um for ou com next(). Lembre que ele é de uso único: uma vez percorrido, se esgota. Nomear é útil quando você quer passar o mesmo gerador para vários pontos antes de consumi-lo.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.