Módulo 4 - Funções como objetos

map e filter

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

O que você vai aprender

  • Usar map para transformar cada item de uma coleção.
  • Usar filter para selecionar itens que passam num teste.
  • Converter o resultado com list, já que map e filter são preguiçosos.
  • Decidir entre map/filter e a compreensão de lista com critério.

map transforma, filter seleciona

map e filter são duas funções de ordem superior que resolvem tarefas muito comuns. map pega uma função e uma coleção e aplica a função a cada item, produzindo uma coleção de resultados transformados. filter pega uma função que responde verdadeiro ou falso e uma coleção, e mantém apenas os itens para os quais a função respondeu verdadeiro. Um transforma, o outro seleciona. Você vai encontrar os dois em código de outras pessoas, então é importante saber ler.

Um detalhe que confunde quem chega agora: no Python 3, map e filter não devolvem uma lista pronta. Eles devolvem um objeto preguiçoso, que só produz cada item quando alguém pede. Isso economiza memória em coleções grandes, mas significa que print de um map mostra algo como map object, não os valores. Para ver o resultado, ou percorrer com um laço, ou envolver com list() para materializar tudo de uma vez.

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

def dobrar(x):
    return x * 2

def eh_par(x):
    return x % 2 == 0

# map: transforma cada item
dobrados = list(map(dobrar, numeros))
print(dobrados)   # [2, 4, 6, 8, 10]

# filter: mantem so os que passam no teste
pares = list(filter(eh_par, numeros))
print(pares)      # [2, 4]

# Sem list(), voce ve o objeto preguicoso:
print(map(dobrar, numeros))  # <map object at 0x...>

map aplica a função a cada item; filter mantém os aprovados. list() materializa.

map, filter ou compreensão de lista?

Aqui vem a parte honesta. Tudo o que map e filter fazem, a compreensão de lista também faz, e quase sempre de forma mais legível para quem lê português e Python. A compreensão junta a transformação e o filtro numa única expressão que se lê quase como uma frase: para cada número, o dobro, se for par. Ela não precisa de list() em volta, não exige uma função nomeada só para transformar e deixa o critério à vista. Por isso, o guia de estilo da comunidade e a maioria do código moderno preferem a compreensão.

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

# Com map + filter + lambda
resultado_a = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numeros)))
print(resultado_a)   # [4, 8, 12]

# Com compreensao de lista (mais clara)
resultado_b = [x * 2 for x in numeros if x % 2 == 0]
print(resultado_b)   # [4, 8, 12]

O mesmo resultado. A compreensão de lista costuma ser mais fácil de ler.

Prefira a compreensão quando

  • Você transforma e filtra ao mesmo tempo
  • O critério cabe numa expressão curta e clara
  • Quer código idiomático que a maioria lê rápido
  • Precisa de uma lista pronta no fim

map/filter podem valer quando

  • Você já tem uma função nomeada pronta (map(str, itens))
  • Trabalha com um fluxo grande e quer o comportamento preguiçoso
  • Encadeia com outras funções que esperam iteradores
  • Está lendo ou mantendo código que já usa esse estilo

Repare no caso em que map ganha pontos: quando já existe uma função pronta com o nome certo, map(str, numeros) fica limpo e direto, sem lambda. Fora isso, se você se pegar escrevendo map com uma lambda e ainda por cima aninhando um filter, é sinal de que a compreensão vai ler melhor. A regra prática é simples: comece pela compreensão; só troque por map ou filter quando eles deixarem aquele trecho específico mais claro, não menos.

Fixando: transformar e selecionar

Saia desta aula com duas certezas. A primeira: você sabe ler e usar map e filter, incluindo o detalhe do objeto preguiçoso que pede list() para materializar. A segunda, igualmente importante: você sabe que, na maioria dos casos do dia a dia, a compreensão de lista diz a mesma coisa com mais clareza. Conhecer map e filter é essencial para entender código alheio; escolher a compreensão quando ela é mais legível é o que torna o seu próprio código pythônico.

Teste rápido

Para dobrar os números pares de uma lista, qual costuma ser a escrita mais clara?

Perguntas frequentes

Por que print de um map não mostra os valores?
Porque no Python 3 map devolve um objeto preguiçoso, que só produz cada item quando pedido. Para ver todos os valores, envolva com list(), como list(map(...)), ou percorra o resultado com um laço for. O mesmo vale para filter.
map e filter são mais rápidos que a compreensão?
A diferença de desempenho costuma ser pequena e raramente importa. Escolha pela clareza, não pela microtimização. Em coleções muito grandes, o comportamento preguiçoso de map e filter pode economizar memória, mas para a maioria dos casos a compreensão é a escolha certa.
Então não vale a pena aprender map e filter?
Vale muito. Você vai encontrar os dois em código de outras pessoas e em bibliotecas, e precisa saber ler. Além disso, map(funcao, itens) com uma função já nomeada fica bem elegante. Aprender é essencial; a escolha diária costuma pender para a compreensão.
Posso usar map com uma função de dois argumentos?
Sim, passando duas coleções: map(soma, lista_a, lista_b) chama soma com um item de cada, em paralelo. Ainda assim, para casos assim uma compreensão com zip costuma ler melhor: [soma(a, b) for a, b in zip(lista_a, lista_b)].
Qual a diferença entre filter e uma compreensão com if?
Elas fazem o mesmo trabalho de selecionar itens. filter(funcao, itens) devolve um objeto preguiçoso; [x for x in itens if condicao] devolve uma lista pronta e deixa o critério à vista. Para a maioria dos casos, a compreensão é mais direta de ler.
O que acontece se eu passar None como função no filter?
filter(None, itens) mantém apenas os itens considerados verdadeiros, removendo zeros, strings vazias, None e listas vazias. É um atalho ocasional, mas costuma ser mais claro escrever a condição explícita numa compreensão para quem lê depois.

Fontes

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