
Passo 1 de 7
Escrever uma transformação como expressão geradora
Converta uma compreensão de lista em uma expressão geradora e identifique cada parte da sintaxe.
Trilha de aprendizado · Nível 10 · Tutorial 4
Expressar transformações e filtros sob demanda e consumir seus resultados em agregações, escolhendo conscientemente entre um gerador e uma coleção materializada.
Escrever uma transformação como expressão geradora
Converta uma compreensão de lista em uma expressão geradora e identifique cada parte da sintaxe. 2 min
Separar criação e consumo
Diferencie o que Python prepara ao criar uma expressão geradora do que só é executado quando valores são solicitados. 3 min
Entender por que o gerador não guarda uma fotografia
Veja como alterações feitas depois da criação podem influenciar valores que o gerador ainda não produziu. 2 min
Somar resultados sem criar uma lista
Use sum para consumir valores transformados e filtrados diretamente, sem materializar uma lista intermediária. 2 min
Verificar condições com any e all
Use any e all para testar condições em dados sob demanda e reconhecer quando o consumo é interrompido. 3 min
Escolher entre gerar e materializar
Decida entre produzir valores sob demanda ou guardá-los em uma lista conforme o tipo de acesso e a reutilização necessários. 2 min
Aplicar e revisar as decisões de consumo
Aplique expressões geradoras a uma análise curta de durações e revise como cada consumidor avança pelos dados. 3 min

Passo 1 de 7
Converta uma compreensão de lista em uma expressão geradora e identifique cada parte da sintaxe.
Você já usa compreensões para transformar e filtrar dados. Para escrever a mesma regra como uma expressão geradora, troque os colchetes externos por parênteses:
[expressão for variável in fonte if condição] → (expressão for variável in fonte if condição)
A transformação, o for e o filtro opcional continuam na mesma ordem. O que muda é o objeto produzido: parênteses criam um gerador, isto é, um iterador; colchetes criam uma lista pronta.
numeros = [2, 3, 4, 5, 6]
quadrados_pares_lista = [n ** 2 for n in numeros if n % 2 == 0]
quadrados_pares_gerador = (n ** 2 for n in numeros if n % 2 == 0)
print(quadrados_pares_lista) # [4, 16, 36]
print(quadrados_pares_gerador) # um objeto gerador, não uma listaNa expressão (n ** 2 for n in numeros if n % 2 == 0), a parte antes de for define o valor produzido. Depois vêm a variável que recebe cada elemento, a fonte dos dados e, se necessário, a condição que seleciona elementos.

A estrutura é a mesma de uma compreensão de lista; os parênteses indicam que o resultado é um gerador.
Dica
Quando não há seleção, basta omitir o if: (preco * 1.1 for preco in precos).
Complete a expressão geradora equivalente a [nome.upper() for nome in nomes if nome.startswith("a")]:
_nome.upper() for nome in nomes if nome.startswith("a")_
Qual objeto é produzido por idades_ativas = (idade for idade in idades if idade >= 18)?

Passo 2 de 7
Diferencie o que Python prepara ao criar uma expressão geradora do que só é executado quando valores são solicitados.
Considere a expressão:
gerador = (n * 10 for n in numeros if n % 2 == 0)
Na criação, Python avalia a expressão do iterável do for mais externo — neste caso, numeros — e obtém seu iterador. O resultado é um objeto gerador.
O filtro n % 2 == 0 e a transformação n * 10 ainda não são executados. Eles ficam para quando alguém pedir valores, por exemplo com next(gerador) ou em um for.
A fonte é preparada na criação; cada candidato só é testado e transformado durante o consumo.

Criação: avaliar a fonte e obter seu iterador. Consumo: buscar, filtrar e transformar valores sob demanda.
Execute estas linhas na ordem mostrada.
numeros = [1, 2, 3, 4]
gerador = (n * 10 for n in numeros if n % 2 == 0)
print(gerador)
print(next(gerador))
print(next(gerador))Para a expressão (n * 10 for n in numeros if n % 2 == 0), associe cada operação ao momento em que ela ocorre.
Toque em um item e depois no par correspondente.
Quando next(gerador) solicita um resultado, o gerador avança nesta ordem:
Se o filtro for falso, não há saída para aquele candidato: o gerador busca o próximo.
Ordene as ações que ocorrem para um candidato aceito em (n * 10 for n in numeros if n % 2 == 0).

Passo 3 de 7
Veja como alterações feitas depois da criação podem influenciar valores que o gerador ainda não produziu.
Ao criar uma expressão geradora, Python obtém o iterador da fonte do for mais externo, mas não calcula de uma vez o filtro nem a transformação. Portanto, ela não cria uma fotografia dos elementos nem fixa automaticamente valores externos usados no cálculo.
Se um elemento da lista ainda não foi solicitado, uma alteração nesse elemento poderá aparecer quando o gerador chegar até ele. Da mesma forma, uma variável como fator será consultada quando a expressão de saída for executada.

O gerador percorre a lista original sob demanda; os valores que ainda não foram produzidos podem refletir alterações posteriores.
Execute o código e compare o resultado com cada alteração feita antes de list consumir o gerador.
valores = [2, 4, 6]
fator = 10
resultado = (numero * fator for numero in valores if numero > 2)
valores[2] = 8 # altera um elemento que ainda será percorrido
fator = 100 # altera um valor consultado no cálculo
valores = [1, 1, 1] # apenas dá outro objeto ao nome valores
print(list(resultado)) # [400, 800]O iterador obtido na criação continua ligado à primeira lista. Nela, os candidatos são 2, 4 e o valor alterado 8. Durante o consumo, 2 falha no filtro; 4 e 8 são multiplicados pelo fator atual, que agora é 100.
A reatribuição valores = [1, 1, 1] não troca a fonte já usada pelo gerador. Ela só faz o nome valores apontar para outra lista.
Atenção
valores[2] = 8 modifica a lista original, que o iterador ainda percorre. Já valores = outra_lista muda apenas o vínculo do nome: não substitui o iterador que foi obtido quando o gerador nasceu.
Considere este código:
numeros = [3, 7]
limite = 5
g = (n for n in numeros if n >= limite)
numeros[1] = 9
limite = 8
print(list(g))O que é exibido?
Sem executar, preveja a saída e explique pelo momento de avaliação:
medidas = [1, 2]
fator = 3
g = (medida * fator for medida in medidas)
medidas[1] = 5
fator = 10
print(list(g))Escreva pelo menos 30 caracteres (0/30).

Passo 4 de 7
Use sum para consumir valores transformados e filtrados diretamente, sem materializar uma lista intermediária.
Quando recebe uma expressão geradora, sum solicita cada valor numérico até a fonte finita se esgotar e acumula o total. Os valores aceitos são produzidos um a um; nenhuma lista de resultados precisa ser criada antes.
Observe que apenas os valores aprovados pelo filtro entram no acumulador.

Cada valor aceito é incorporado ao total assim que é solicitado por sum.
A expressão geradora é o único argumento de sum.
numeros = [2, 5, 8, 11]
total = sum(numero ** 2 for numero in numeros if numero % 2 == 0)
print(total) # 68Se a expressão geradora for o único argumento de sum, seus próprios parênteses podem ser omitidos: sum(expressao for ... ). Mas, se você informar outro argumento, como o valor inicial, mantenha os parênteses da expressão geradora para separar os argumentos.
Exemplo
valores = [3, 6, 9]
# Um único argumento: parênteses internos dispensados
total = sum(valor * 10 for valor in valores if valor > 5)
# 60 + 90 = 150
# Dois argumentos: parênteses internos necessários
total_com_inicial = sum((valor * 10 for valor in valores if valor > 5), 100)
# 100 + 60 + 90 = 250Dica
Na segunda chamada, (valor * 10 for ...) é o primeiro argumento, e 100 é o valor inicial. Sem os parênteses internos, a chamada não tem a sintaxe esperada para dois argumentos.
Sem valor inicial informado, sum retorna 0 quando o gerador não produz nenhum número. Isso ocorre, por exemplo, se nenhum elemento satisfaz o filtro.
Nenhum número da lista é maior que 10.
idades = [4, 7, 9]
total = sum(idade for idade in idades if idade > 10)
print(total) # 0Complete o código para somar os cubos dos números pares de numeros diretamente com uma expressão geradora:
total = sum(_____ for numero in numeros if numero % 2 == 0)

Passo 5 de 7
Use any e all para testar condições em dados sob demanda e reconhecer quando o consumo é interrompido.
Em vez de usar uma condição como filtro, faça a expressão geradora produzir o resultado da condição. Assim, cada valor produzido é True ou False.
Use any(...) quando a pergunta for “existe pelo menos um?”. Use all(...) quando for “todos atendem?”.
temperaturas = [18, 21, 27, 31]
existe_calor = any(t > 30 for t in temperaturas)
todas_amenas = all(t < 30 for t in temperaturas)
print(existe_calor) # True
print(todas_amenas) # FalseA condição está antes do for: ela é o valor que o gerador entrega a cada item.

any procura o primeiro True; all procura o primeiro False.
any devolve True assim que consome um True; se não encontrar nenhum, devolve False ao esgotar a entrada.
all devolve False assim que consome um False; se todos forem verdadeiros, devolve True ao esgotar a entrada. O valor decisivo é consumido, mas os valores posteriores não são solicitados.
Exemplo
valores = [4, 7, 0, 9]
resultado = all(v > 0 for v in valores)
print(resultado) # Falseall examina 4 (True), 7 (True) e 0 (False). Como 0 decide o resultado, 9 não é solicitado por esse consumo.
Dica
Uma expressão geradora é consumida uma vez. Para fazer perguntas separadas sobre uma lista reutilizável, crie uma expressão geradora para cada chamada de any ou all.
Relacione cada requisito à função mais adequada.
Toque em um item e depois no par correspondente.
Em uma entrada sem valores, any(...) retorna False: não apareceu nenhum True. Já all(...) retorna True: não apareceu nenhum valor que violasse a condição.
No código any(n % 2 == 0 for n in [3, 8, 10]), o valor 10 não é examinado.
A expressão all(x > 0 for x in []) retorna True.

Passo 6 de 7
Decida entre produzir valores sob demanda ou guardá-los em uma lista conforme o tipo de acesso e a reutilização necessários.
Use uma expressão geradora quando você precisa percorrer os resultados uma vez, por exemplo para calcular um total com sum. Ela produz cada valor quando o consumidor o solicita.
Use uma compreensão de lista quando precisar guardar os resultados para acessar posições, usar len ou percorrê-los novamente. Um gerador é um iterador: não oferece automaticamente índice nem comprimento.
Compare o acesso oferecido por cada escolha.

Gerador para consumo sequencial sob demanda; lista para acesso, tamanho e novas passagens.
Dica
Não existe uma escolha sempre melhor: escolha o gerador para um consumo sequencial único; escolha a lista quando acesso por posição ou reutilização forem requisitos reais.
Exemplo
quadrados = (n ** 2 for n in range(1, 5))
primeiro = next(quadrados) # 1
restantes = list(quadrados) # [4, 9, 16]list(quadrados) consome os valores restantes. O 1 já foi entregue e não reaparece.
Recriar funciona se a fonte puder fornecer um novo percurso:
valores = [1, 2, 3]
g1 = (n ** 2 for n in valores)
g2 = (n ** 2 for n in valores)
# g1 e g2 percorrem a lista separadamenteMas recriar sobre um iterador já esgotado não o reinicia:
fonte = iter([1, 2, 3])
list(n ** 2 for n in fonte) # [1, 4, 9]
list(n ** 2 for n in fonte) # []
Passo 7 de 7
Aplique expressões geradoras a uma análise curta de durações e revise como cada consumidor avança pelos dados.
Considere as durações de tarefas abaixo, em minutos. Uma tarefa é elegível quando dura pelo menos 30 minutos.
Como duracoes é uma lista reutilizável, você pode criar uma expressão geradora independente para cada pergunta. Assim, o consumo por sum, any ou all não interfere nos demais.
Crie um arquivo Python, copie o código e execute-o. Cada expressão geradora é consumida pelo seu próprio consumidor.
duracoes = [25, 40, 55, 15]
# Soma, em horas, somente as tarefas elegíveis.
total_horas = sum(duracao / 60 for duracao in duracoes if duracao >= 30)
# Há alguma tarefa que dura mais de 50 minutos?
existe_tarefa_longa = any(duracao > 50 for duracao in duracoes)
# Todas as tarefas duram pelo menos 15 minutos?
todas_tem_minimo = all(duracao >= 15 for duracao in duracoes)
# Quando ninguém atende ao filtro, sum recebe zero valores.
total_sem_elegiveis = sum(duracao / 60 for duracao in duracoes if duracao >= 90)
print(total_horas)
print(existe_tarefa_longa)
print(todas_tem_minimo)
print(total_sem_elegiveis)A lista pode fornecer novos iteradores para expressões geradoras independentes. Cada consumidor avança apenas pelo fluxo que recebeu.

Cada gerador tem consumo próprio; a fonte em lista continua disponível para novas passagens.
sum solicita todos os valores numéricos que o gerador ainda puder produzir. No último cálculo, nenhum valor passa pelo filtro duracao >= 90; por isso, sem valor inicial informado, sum devolve 0.
any para ao encontrar o primeiro resultado verdadeiro. all para ao encontrar o primeiro resultado falso. Como os dois recebem geradores novos, ambos podem percorrer duracoes sem disputar a posição de consumo.
Depois de executar o código no seu computador, informe os quatro valores exibidos. Explique também por que total_sem_elegiveis é 0.
Escreva pelo menos 50 caracteres (0/50).
Você agora precisa mostrar o primeiro valor elegível por índice e percorrer todos os elegíveis duas vezes. Justifique por que uma compreensão de lista passa a ser mais adequada. Diga também como evitar reutilizar um gerador que já foi consumido.
Escreva pelo menos 70 caracteres (0/70).
Resumo
Use a necessidade do programa para decidir entre produzir valores sob demanda e guardá-los.
for mais externo e obtém seu iterador.if e a expressão de saída são executados quando um consumidor solicita valores.sum consome todos os valores restantes; sem valores e sem início explícito, retorna 0.any para no primeiro valor verdadeiro; all para no primeiro valor falso.len ou várias passagens pelos resultados.Parabéns! Você concluiu: Transformar dados com expressões geradoras
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks