Módulo 3 - Funções avançadas

Funções lambda e prática do módulo

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

O que você vai aprender

  • Escrever uma função lambda e entender que ela é uma função anônima curta.
  • Decidir quando usar lambda e quando preferir uma função com def.
  • Aplicar lambda em situações típicas, como ordenar por um critério.
  • Praticar juntando *args e parâmetros padrão em funções flexíveis.

O que é uma função lambda

Às vezes você precisa de uma função tão pequena e tão pontual que dar um nome a ela com def parece burocracia. Para esses casos existe a lambda: uma função anônima, escrita em uma única linha, com a forma lambda parâmetros: expressão. Ela recebe parâmetros como qualquer função, mas o corpo é uma só expressão, cujo valor é devolvido automaticamente, sem a palavra return. É a mesma ideia de uma função comum, comprimida ao essencial.

dobro = lambda x: x * 2
print(dobro(5))  # 10

# Equivale a esta funcao com def:
def dobro_def(x):
    return x * 2
print(dobro_def(5))  # 10

# Lambda com dois parametros
soma = lambda a, b: a + b
print(soma(3, 4))  # 7

A lambda e a função com def fazem o mesmo. A lambda só é mais curta e anônima.

Guardar uma lambda em uma variável, como no exemplo, serve para mostrar a equivalência, mas quase nunca é o melhor uso. Se você vai dar um nome a ela de qualquer forma, é mais claro usar def. A lambda brilha mesmo quando é usada de passagem, sem nome, entregue direto para outra função que espera uma pequena regra. O caso mais comum é dizer a uma função de ordenação como comparar os itens.

Quando lambda ajuda de verdade

O lugar natural da lambda é como argumento de funções que recebem outra função, chamadas de ordem superior. O exemplo clássico é sorted com o parâmetro key: você entrega uma lambda que extrai, de cada item, o valor que serve de critério. Ordenar uma lista de pessoas pela idade, ou de produtos pelo preço, fica limpo e direto. A lambda existe só naquele momento, faz o seu trabalho e some.

pessoas = [
    {"nome": "Ana", "idade": 30},
    {"nome": "Bruno", "idade": 25},
    {"nome": "Carla", "idade": 41},
]

# Ordena pela idade usando lambda como criterio
por_idade = sorted(pessoas, key=lambda p: p["idade"])
for p in por_idade:
    print(p["nome"], p["idade"])
# Bruno 25
# Ana 30
# Carla 41

sorted recebe uma lambda que diz qual valor de cada item usar para ordenar.

A regra prática é curta: lambda para lógica trivial e de uma linha, usada de passagem; def para tudo que tem nome, corpo maior ou vai se repetir. A lambda não é uma versão melhor da função; é uma conveniência para casos minúsculos. Usá-la fora disso costuma piorar a leitura, e legibilidade é o valor que este módulo inteiro defende. Sabendo quando não usar, você já usa lambda bem.

Prática: funções flexíveis de verdade

Para fechar o módulo, vamos juntar o que você aprendeu em uma prática. A ideia é criar funções flexíveis, que aceitam quantidade variável de valores e têm padrões convenientes. Primeiro, uma função de estatísticas que recebe quantos números você quiser com *args e devolve um resumo. Depois, um formatador de moeda com parâmetros padrão, chamado com argumentos nomeados. Abra o Playground do curso e digite os dois blocos abaixo, mudando os valores para experimentar.

def estatisticas(*numeros):
    if not numeros:
        return {"quantidade": 0, "soma": 0, "media": 0}
    return {
        "quantidade": len(numeros),
        "soma": sum(numeros),
        "media": sum(numeros) / len(numeros),
    }

print(estatisticas(10, 20, 30))
# {'quantidade': 3, 'soma': 60, 'media': 20.0}
print(estatisticas(7))
# {'quantidade': 1, 'soma': 7, 'media': 7.0}
print(estatisticas())
# {'quantidade': 0, 'soma': 0, 'media': 0}

*numeros aceita de zero a muitos valores; o if trata o caso sem números com segurança.

def formatar_moeda(valor, moeda="BRL", casas=2, prefixo=True):
    numero = f"{valor:.{casas}f}"
    if prefixo:
        return f"{moeda} {numero}"
    return f"{numero} {moeda}"

print(formatar_moeda(1990.5))
# BRL 1990.50
print(formatar_moeda(1990.5, moeda="USD"))
# USD 1990.50
print(formatar_moeda(1990.5, casas=0, prefixo=False))
# 1991 BRL

Parâmetros padrão para o caso comum, argumentos nomeados para ajustar só o que muda.

Repare como as duas funções aplicam o módulo inteiro. Em estatisticas, o *numeros deixa a função aberta a qualquer quantidade de valores, e o if not numeros evita a divisão por zero quando nada é passado. Em formatar_moeda, os parâmetros padrão cobrem o caso mais comum (Real, duas casas, prefixo na frente) e os argumentos nomeados deixam a chamada clara quando você quer mudar só um detalhe. Nada de padrão mutável, tudo legível. É exatamente o tipo de função reaproveitável que separa o intermediário do básico.

Teste rápido

Qual afirmação sobre funções lambda está correta?

Perguntas frequentes

Lambda é mais rápida que uma função normal?
Não de forma relevante. Uma lambda e uma função equivalente com def têm desempenho praticamente igual, porque ambas viram o mesmo tipo de objeto função. A escolha entre elas é sobre clareza, não velocidade: use lambda para expressões curtas de passagem e def para o resto.
Posso ter mais de um parâmetro em uma lambda?
Pode. A forma é lambda a, b: a + b, com os parâmetros separados por vírgula antes dos dois pontos. Também dá para ter parâmetros com valor padrão. O que a lambda não aceita é ter várias instruções: o corpo precisa ser uma única expressão que produz um valor.
Por que não devo guardar uma lambda em uma variável?
Porque, se você vai dar um nome a ela, uma função com def é mais clara e aparece melhor em mensagens de erro e em ferramentas de depuração. Guardar lambda em variável funciona, mas a própria PEP 8 recomenda usar def nesse caso. Reserve a lambda para uso anônimo, de passagem.
O que são map e filter, que aparecem junto de lambda?
São funções de ordem superior que recebem uma função e aplicam a cada item de uma sequência: map transforma cada item, filter mantém só os que passam num teste. Elas costumam receber lambdas. Em Python moderno, muitas vezes uma compreensão de lista faz o mesmo de forma ainda mais legível.
Na prática do módulo, por que estatisticas trata o caso sem números?
Porque *numeros pode chegar vazio, e calcular a média dividiria por zero, gerando erro. O if not numeros devolve um resumo seguro nesse caso. Tratar a borda vazia é um hábito do intermediário: a função continua correta mesmo quando é chamada de um jeito inesperado.
Como o formatador junta os temas do módulo?
Ele usa parâmetros padrão (moeda, casas e prefixo têm valores comuns), permite chamadas com argumentos nomeados para ajustar só um detalhe, e evita padrão mutável, já que todos os padrões são imutáveis. É um resumo prático de tudo que a função avançada oferece, em uma peça pequena e reaproveitável.

Fontes

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