Módulo 4 - Programação funcional
map, filter, lambda e compreensões
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Aplicar uma função a cada item com map.
- Selecionar itens por um critério com filter.
- Escrever funções curtas e anônimas com lambda.
- Escolher entre map/filter e compreensões por legibilidade.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: map, filter, lambda e compreensões.
Os objetivos desta aula. Aplicar uma função a cada item com map. Selecionar itens por um critério com filter. Escrever funções curtas e anônimas com lambda. Escolher entre map/filter e compreensões por legibilidade.
Veja o essencial, parte por parte.
map e filter: transformar e selecionar. map aplica uma função a cada item de um iterável.
lambda: função curta e sem nome. Um lambda cabe numa expressão só; não use para lógica com vários passos.
Compreensão ou map: qual usar. No Python, muitas vezes a compreensão de lista é a forma mais clara de fazer o que map e filter fazem.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
map e filter: transformar e selecionar
Duas operações aparecem sem parar ao trabalhar com coleções: transformar cada item e selecionar alguns itens. O map cuida da transformação: ele recebe uma função e um iterável, e aplica a função a cada elemento, produzindo os resultados. O filter cuida da seleção: recebe uma função que devolve verdadeiro ou falso e um iterável, e mantém apenas os itens em que a função deu verdadeiro. Ambos devolvem um iterador preguiçoso, então costuma-se envolvê-los em list para ver o resultado de uma vez.
numeros = [1, 2, 3, 4, 5, 6]
# map: transforma cada item (aqui, eleva ao quadrado)
def ao_quadrado(n: int) -> int:
return n * n
quadrados = list(map(ao_quadrado, numeros))
print(quadrados) # [1, 4, 9, 16, 25, 36]
# filter: seleciona os pares
def eh_par(n: int) -> bool:
return n % 2 == 0
pares = list(filter(eh_par, numeros))
print(pares) # [2, 4, 6]map aplica ao_quadrado a cada item; filter mantém só os que passam em eh_par.
Nos exemplos, o map transformou cada número no seu quadrado e o filter selecionou apenas os pares. Note que ambos recebem uma função como argumento, o que casa com a ideia de tratar funções como valores. Quando a função é pequena e usada só ali, definir uma função nomeada como ao_quadrado ou eh_par pode ser exagero. É aí que entra o lambda.
lambda: função curta e sem nome
Um lambda é uma função anônima de uma linha. Você escreve a palavra lambda, os parâmetros, dois pontos e a expressão que ela devolve. Não há return: o valor da expressão já é o retorno. O lambda brilha como argumento de map, filter e sorted, onde a função é curta e descartável. Escrever lambda n: n * n no lugar de definir ao_quadrado deixa a intenção junto do uso. Para lógica maior, porém, uma função nomeada de verdade é mais legível e testável.
numeros = [1, 2, 3, 4, 5, 6]
quadrados = list(map(lambda n: n * n, numeros))
print(quadrados) # [1, 4, 9, 16, 25, 36]
pares = list(filter(lambda n: n % 2 == 0, numeros))
print(pares) # [2, 4, 6]
# lambda tambem e util como chave de ordenacao:
palavras = ["casa", "oi", "banana"]
print(sorted(palavras, key=lambda p: len(p))) # ['oi', 'casa', 'banana']lambda define a função no próprio lugar; ótimo para argumentos curtos de map, filter e sorted.
Compreensão ou map: qual usar
No Python, muitas vezes a compreensão de lista é a forma mais clara de fazer o que map e filter fazem. Elevar ao quadrado os pares, por exemplo, cabe numa única compreensão que transforma e filtra ao mesmo tempo. A comunidade Python tende a preferir a compreensão quando a transformação é simples, porque ela se lê quase como uma frase. O map e o filter ganham espaço quando você já tem uma função nomeada pronta para passar, ou quando encadeia várias transformações e a leitura fica melhor.
numeros = [1, 2, 3, 4, 5, 6]
# Compreensao: transforma e filtra numa linha legivel
quadrados_pares = [n * n for n in numeros if n % 2 == 0]
print(quadrados_pares) # [4, 16, 36]
# Equivalente com map e filter, mais verboso:
quadrados_pares2 = list(map(lambda n: n * n, filter(lambda n: n % 2 == 0, numeros)))
print(quadrados_pares2) # [4, 16, 36]A compreensão une transformação e filtro numa linha; a versão com map e filter é mais verbosa.
Prefira a compreensão quando
- A transformação é simples e cabe numa linha
- Você transforma e filtra ao mesmo tempo
- A legibilidade estilo frase ajuda
- É código novo, idiomático em Python
Prefira map ou filter quando
- Já existe uma função nomeada para aplicar
- Você encadeia várias etapas de transformação
- O iterável é grande e a preguiça do map ajuda
- O estilo funcional do time é a convenção
Teste rápido
O que a chamada filter faz com um iterável e uma função que devolve verdadeiro ou falso?
Perguntas frequentes
- map e filter devolvem uma lista direto?
- Não. Ambos devolvem um iterador preguiçoso, que produz os itens sob demanda. Para ver todos de uma vez você envolve em list, como list(map(...)). A preguiça é uma vantagem com dados grandes, porque nada é calculado antes de ser pedido, mas surpreende quem espera uma lista imediata.
- Quando devo usar lambda em vez de uma função def?
- Use lambda para funções bem curtas e descartáveis, passadas na hora como argumento de map, filter ou sorted. Se a lógica tem vários passos, se repete pelo código ou merece um nome que explique a intenção, prefira uma função nomeada com def, que é mais legível e pode ser testada sozinha.
- A compreensão de lista é sempre melhor que map?
- Não sempre, mas costuma ser mais legível para transformações simples e é o estilo idiomático em Python. O map se sai bem quando você já tem uma função nomeada para aplicar ou quando encadeia etapas. Escolha pela clareza: a versão que se lê melhor naquele caso costuma ser a certa.
- Posso usar map com uma função de mais de um argumento?
- Pode. Se a função recebe dois argumentos, você passa dois iteráveis ao map, e ele combina os itens posição a posição. Por exemplo, somar pares de duas listas. Ainda assim, quando isso complica a leitura, uma compreensão com zip costuma expressar a mesma ideia de forma mais clara.
- Existe compreensão para dicionário e conjunto também?
- Sim. Além da compreensão de lista entre colchetes, há a de dicionário entre chaves, que produz pares chave e valor, e a de conjunto, também entre chaves, que gera um conjunto sem repetições. Todas seguem a mesma ideia de transformar e filtrar de forma concisa e legível.
- lambda pode ter um if dentro?
- Pode usar a expressão condicional, no formato valor_se_verdadeiro if condicao else valor_se_falso, porque isso é uma expressão. O que não cabe num lambda é um if com blocos, atribuições ou vários passos. Se você precisa disso, é sinal de que uma função nomeada seria mais adequada.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.