Trilha de aprendizado · Nível 9 · Tutorial 2

Escolher entre lambda, funções nomeadas e compreensões

Ao concluir, você será capaz de escrever funções curtas com lambda e escolher uma forma de expressão adequada à tarefa e à legibilidade.

  • Nível: Intermediário
  • Duração: 12 min
  • 6 passos
Escolher entre lambda, funções nomeadas e compreensões

Passo 1 de 6

Escrever uma função com lambda

Construa uma função curta com lambda e diferencie sua criação da chamada que produz um resultado.

Uma função em uma expressão

Sintaxe de lambda

Uma expressão lambda cria uma função sem usar uma declaração def nomeada.

A forma básica é:

lambda parâmetros: expressão

Os parâmetros recebem valores quando a função é chamada. O resultado da expressão é retornado automaticamente: não escreva return.

Anatomia de uma lambda

Leia da esquerda para a direita: lambda inicia a função, numero é o parâmetro, os dois-pontos separam a entrada do cálculo e numero * 2 produz o resultado.

Diagrama de uma lambda simples, separando visualmente a palavra lambda, o parâmetro numero, os dois-pontos e a expressão numero vezes dois, com entrada quatro e saída oito.

A expressão após os dois-pontos é o valor que a função devolverá.

Criar não é chamar

Guardar e usar a função

Execute este código no seu editor ou no interpretador Python.

python
dobrar = lambda numero: numero * 2

resultado = dobrar(4)
print(resultado)  # 8

Dois momentos diferentes

Na primeira linha, lambda numero: numero * 2 cria um objeto função e ele é associado ao nome dobrar. O cálculo ainda não aconteceu.

Na segunda linha, dobrar(4) chama essa função. O valor 4 ocupa o parâmetro numero, a expressão calcula 4 * 2 e a chamada resulta em 8.

Dica

Leia os parênteses

O nome dobrar se refere à função. Já dobrar(4), com parênteses, representa a chamada e produz um valor.

Complete a transformação

Desconto de 10%

Complete o corpo da lambda para criar uma função que receba preco e devolva o valor com 10% de desconto.

com_desconto = lambda preco: ____

Ao chamar com_desconto(100), o resultado deve ser 90.0.

Função ou resultado?

Observe o código

Considere:

triplicar = lambda valor: valor * 3
saida = triplicar(5)

Qual afirmação está correta?

Passo 2 de 6

Usar lambda diretamente em um argumento

Use uma lambda curta no argumento key quando o critério de ordenação for simples, pontual e fácil de ler ao lado da chamada.

Uma regra curta no ponto de uso

Lambda dentro de key

Quando a ordenação precisa apenas extrair um campo de cada dicionário, a lambda pode ficar diretamente em key. Assim, a regra é lida no mesmo lugar em que será usada.

livros_ordenados = sorted(livros, key=lambda livro: livro["ano"])

A lambda recebe cada livro e devolve seu "ano", que será usado como chave de comparação. Ela não ordena sozinha: apenas informa qual valor sorted deve consultar em cada item.

Como key usa a lambda

Observe que os dicionários continuam sendo os elementos do resultado; os anos servem somente para definir a ordem.

Diagrama mostrando três dicionários de livros entrando em sorted, uma lambda extraindo o campo ano de cada um e os mesmos dicionários saindo ordenados pelo ano.

lambda livro: livro["ano"] extrai uma chave de comparação para cada registro.

Lambda ou função já definida?

Duas formas equivalentes

As duas versões abaixo usam a mesma regra de ordenação.

python
livros = [
    {"titulo": "Horizonte", "ano": 2022},
    {"titulo": "Raiz", "ano": 2018},
    {"titulo": "Vento", "ano": 2020},
]

# Regra escrita diretamente no argumento:
por_lambda = sorted(livros, key=lambda livro: livro["ano"])

# Regra passada por um nome já disponível:
def extrair_ano(livro):
    return livro["ano"]

por_funcao = sorted(livros, key=extrair_ano)

assert por_lambda == por_funcao
print([livro["titulo"] for livro in por_lambda])
# ['Raiz', 'Vento', 'Horizonte']

Dica

Critério prático

Prefira a lambda direta quando a extração for curta, usada só ali e continuar imediatamente compreensível. Passar uma função nomeada também é válido; lambda é uma opção, não uma obrigação.

Pratique: ordenar pelo campo pedido

Complete e justifique

Considere:

produtos = [
    {"nome": "Caderno", "preco": 18.0},
    {"nome": "Caneta", "preco": 4.5},
    {"nome": "Mochila", "preco": 120.0},
]

Escreva uma linha que crie ordenados com os produtos em ordem crescente de preco, usando uma lambda em key. Em seguida, explique em uma frase por que essa lambda permanece clara nesse ponto do código.

Escreva pelo menos 40 caracteres (0/40).

Passo 3 de 6

Separar expressão curta de código claro

Entenda o limite sintático de uma lambda e por que uma expressão válida não é necessariamente clara ou livre de efeitos colaterais.

Uma expressão, não um bloco

O limite de lambda

O corpo de uma lambda contém uma única expressão: algo que é avaliado e produz um valor. Ela não aceita um bloco de instruções como uma função escrita com def.

Isso é uma regra de sintaxe. Não significa que toda lambda será pequena, fácil de ler ou isenta de ações além de calcular um resultado.

Estrutura permitida

Compare o corpo de uma lambda com o corpo de uma função nomeada.

Diagrama comparando uma lambda com uma expressão única e uma função def com várias instruções em um bloco indentado.

A lambda recebe parâmetros e avalia uma expressão; def pode organizar várias instruções em um bloco.

Uma linha pode esconder bastante

Expressão não é sinônimo de simplicidade

Uma expressão pode incluir chamadas, condições e operadores. Portanto, ela pode ficar longa ou difícil de interpretar, mesmo aparecendo em uma única linha.

Por exemplo, esta lambda é sintaticamente válida e retorna um texto:

Válida, mas exigente de ler

python
rotulo = lambda produto: (
    f"{produto['nome'].strip().title()} — "
    f"R$ {produto['preco'] * (1 - produto['desconto']):.2f}"
)

item = {"nome": "  caderno  ", "preco": 20.0, "desconto": 0.1}
print(rotulo(item))  # Caderno — R$ 18.00

Atenção

Validade não é recomendação

O código é válido e seu comportamento pode estar correto. Ainda assim, quando uma lambda acumula detalhes, condicionais ou muitas operações, a intenção pode deixar de ser evidente. Lambdas extensas ou aninhadas são um sinal para revisar a clareza.

Uma lambda pode causar efeitos

A expressão pode chamar algo que altera o mundo

O fato de o corpo ser uma expressão não impede chamadas com efeitos colaterais. print() exibe uma mensagem; métodos como append() modificam uma lista. Se forem chamados dentro da expressão, esses efeitos acontecem quando a lambda é executada.

Chamada com efeito colateral

python
numeros = []
adicionar = lambda numero: numeros.append(numero)

resultado = adicionar(7)
print(numeros)   # [7]
print(resultado) # None

Dica

Leia o que é chamado

Para avaliar uma lambda, observe não só seu tamanho, mas também as chamadas dentro dela. Uma expressão pode retornar um valor, exibir algo, modificar um objeto — ou combinar comportamentos que ficam difíceis de entender.

Verifique a afirmação

Sintaxe e efeito

Toda lambda é livre de efeitos colaterais porque seu corpo aceita apenas uma expressão.

Passo 4 de 6

Dar um nome à regra com def

Refatore uma lambda pouco clara para uma função nomeada que revele a intenção sem mudar o comportamento.

Quando o nome explica melhor

Uma regra merece um nome?

Prefira def quando um nome significativo tornar a regra mais fácil de entender. Isso vale mesmo para uma implementação curta ou usada apenas uma vez: o nome pode explicar por que aquela transformação existe.

Evite usar uma lambda atribuída a uma variável como se fosse uma função nomeada. Se a intenção é criar uma regra estável, declare-a com def.

Mesma transformação, comunicação diferente

As duas formas abaixo podem produzir o mesmo resultado, mas a função nomeada torna a regra reconhecível no ponto de uso.

Comparação visual entre uma lambda atribuída a uma variável e uma função definida com def, ambas recebendo um título e devolvendo o título limpo.

O comportamento pode ser preservado; a escolha melhora a leitura do código.

Dica

Critério prático

Pergunte: “alguém entende a regra ao ler apenas o nome?” Se a resposta for sim, um def bem nomeado costuma ser uma escolha mais clara.

Refatoração: preservar e esclarecer

Antes: a regra está escondida

Nesta lambda, há mais de uma etapa: remover espaços das pontas e converter o texto para minúsculas. O nome ajustar não explica qual é a regra aplicada.

Versão com lambda

python
ajustar = lambda titulo: titulo.strip().lower()

assert ajustar("  Python para Dados  ") == "python para dados"

Depois: a intenção fica visível

A refatoração mantém o mesmo parâmetro, o mesmo valor retornado e o mesmo resultado. Agora, o nome informa o propósito; as etapas também podem ficar explícitas para facilitar mudanças futuras.

Versão com def

python
def normalizar_titulo(titulo):
    """Remove espaços externos e converte o título para minúsculas."""
    titulo_sem_espacos = titulo.strip()
    return titulo_sem_espacos.lower()

assert normalizar_titulo("  Python para Dados  ") == "python para dados"

Exemplo

O que foi preservado

Para a entrada " Python para Dados ", ambas as versões retornam "python para dados". A mudança é de forma e clareza, não de comportamento.

Pratique a escolha de um nome

Refatore a regra

Reescreva esta regra usando def, com um nome que expresse sua intenção. Em seguida, justifique em uma frase o ganho de clareza.

valido = lambda ano: ano <= 2024

Seu código deve continuar retornando True para 2024 e False para 2025.

Escreva pelo menos 80 caracteres (0/80).

Passo 5 de 6

Escolher entre uma função e uma coleção

Decida se a tarefa precisa entregar um comportamento para ser chamado ou produzir imediatamente uma nova lista.

Função entregue ou lista produzida?

Duas responsabilidades diferentes

lambda e def criam funções: objetos que outra operação pode chamar depois. Já uma compreensão de lista é avaliada para produzir uma lista naquele momento.

Escolha uma função quando uma API pede um comportamento, como o critério key de sorted. Escolha uma compreensão quando seu objetivo imediato é obter dados transformados ou filtrados em uma nova coleção.

Contraste entre comportamento e resultado

Observe o destino de cada forma de expressão.

Diagrama em duas colunas: uma função é entregue a sorted como critério de ordenação; uma compreensão recebe uma lista de títulos e produz uma nova lista de títulos normalizados.

Uma função é passada para ser chamada; uma compreensão produz a lista que você quer usar.

Dica

Pergunta-guia

Pergunte: “Outra operação precisa chamar uma regra?” Se sim, entregue uma função. Pergunte: “Quero construir a lista resultante agora?” Se sim, use uma compreensão.

As formas podem trabalhar juntas

Nomeie a transformação quando ela tiver intenção própria

Uma compreensão não impede o uso de def. Se a transformação tem um nome que esclarece a regra, defina a função e chame-a dentro da compreensão. Assim, cada trecho mantém sua responsabilidade: a função normaliza um título; a compreensão monta a lista.

Função para a regra; compreensão para a coleção

Execute este exemplo e compare os tipos e resultados.

python
livros = [
    {"titulo": "  Python para Dados ", "paginas": 320},
    {"titulo": "introdução a python", "paginas": 95},
    {"titulo": "TESTES EM PYTHON", "paginas": 180},
]

# Uma lambda é uma função entregue a sorted como critério.
por_paginas = sorted(livros, key=lambda livro: livro["paginas"])

# A regra tem um nome útil; a compreensão constrói a lista final.
def normalizar_titulo(titulo):
    return titulo.strip().title()

titulos_longos = [
    normalizar_titulo(livro["titulo"])
    for livro in livros
    if livro["paginas"] >= 100
]

print([livro["paginas"] for livro in por_paginas])
print(titulos_longos)

# Saída:
# [95, 180, 320]
# ['Python Para Dados', 'Testes Em Python']

Exemplo

Leitura da escolha

key=lambda livro: livro["paginas"] fornece uma regra curta para sorted chamar. Já titulos_longos recebe uma lista pronta: a compreensão filtra os livros e coleta os títulos normalizados.

Não há competição entre as formas: elas se complementam.

Escolha pela responsabilidade

Associe cada demanda à forma mais adequada

Relacione cada situação à escolha que melhor atende à sua responsabilidade.

Toque em um item e depois no par correspondente.

Passo 6 de 6

Aplicar e justificar as escolhas

Resolva uma transformação de um catálogo de livros e justifique quando usar lambda, def e compreensão.

Uma escolha para cada responsabilidade

Do comportamento ao resultado

Neste desafio, cada forma resolve uma responsabilidade diferente:

  • Use uma lambda curta e local para informar a chave de ordenação.
  • Use def para a regra de normalização: ela tem um nome que explica o que faz e pode crescer com documentação ou mais etapas.
  • Use uma compreensão quando o objetivo for produzir imediatamente uma nova lista.

A melhor forma não é a mais curta: é a que deixa clara a tarefa de cada trecho.

Fluxo da transformação

Observe o que cada construção entrega ao código.

Diagrama mostrando um catálogo de livros que passa por uma ordenação com lambda, pela normalização de títulos com uma função nomeada e por uma compreensão que cria uma lista final de títulos disponíveis.

A lambda fornece um critério pontual; def nomeia uma regra; a compreensão constrói a coleção final.

Prática local: catálogo de livros

Copie, execute e confira

No seu editor, crie um arquivo Python, copie o código completo abaixo e execute-o. Ele ordena os livros por ano, normaliza os títulos e cria uma lista apenas com os títulos disponíveis. Os assert verificam localmente o resultado esperado.

catalogo.py

Exemplo autocontido para execução local.

python
livros = [
    {"titulo": "  o guia do python  ", "ano": 2022, "disponivel": True},
    {"titulo": "algoritmos práticos", "ano": 2018, "disponivel": False},
    {"titulo": "  dados e histórias  ", "ano": 2020, "disponivel": True},
]


def normalizar_titulo(titulo):
    """Remove espaços extras e padroniza a capitalização do título."""
    return titulo.strip().title()


livros_por_ano = sorted(livros, key=lambda livro: livro["ano"])

titulos_disponiveis = [
    normalizar_titulo(livro["titulo"])
    for livro in livros_por_ano
    if livro["disponivel"]
]

assert [livro["ano"] for livro in livros_por_ano] == [2018, 2020, 2022]
assert titulos_disponiveis == ["Dados E Histórias", "O Guia Do Python"]

print(livros_por_ano)
print(titulos_disponiveis)

Exemplo

Resultado esperado

A lista livros_por_ano mantém os três dicionários na ordem dos anos 2018, 2020 e 2022.

A saída de titulos_disponiveis é:

['Dados E Histórias', 'O Guia Do Python']

Se os assert não exibirem erro, as verificações passaram.

Dica

Adapte sem trocar as responsabilidades

Experimente alterar os dados: inclua outro livro ou mude disponivel. Preserve a lambda como chave pontual de sorted, a função nomeada para normalizar e a compreensão para montar a lista. Atualize os assert conforme o novo resultado esperado.

Revisão e justificativa

Explique suas escolhas

Depois de executar ou analisar o exemplo, justifique: por que a lambda é adequada para a ordenação, por que normalizar_titulo merece def e por que a última etapa é uma compreensão? Cite também o que os assert verificam.

Escreva pelo menos 120 caracteres (0/120).

Resumo

Critérios para decidir

Use a forma que comunica melhor a responsabilidade atual.

  • Lambda: função curta, simples e usada localmente, como uma regra de key.
  • Def: regra que ganha clareza com um nome, documentação, reutilização ou várias instruções.
  • Compreensão: construção imediata de uma coleção transformada ou filtrada.
  • Refatorar a forma de expressar o código pode preservar exatamente o mesmo comportamento e torná-lo mais legível.

Tutorial concluído

Parabéns! Você concluiu: Escolher entre lambda, funções nomeadas e compreensões

Muito bem! Agora você consegue distinguir uma função passada como comportamento de uma compreensão que produz uma coleção, escolhendo uma expressão clara para cada caso.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso