Uma função que você não se incomoda em nomear
A maioria das funções em Python é definida com def, tem nomes e mora num arquivo onde pode ser reusada. Uma lambda é uma alternativa menor e sem nome — útil nos poucos casos onde definir uma função completa seria mais cerimônia do que vale.
Aqui vai o formato lado a lado:
Duas funções, as duas fazendo exatamente a mesma coisa. A versão lambda cabe numa linha porque é basicamente esse o trabalho dela: uma função descartável para um momento descartável.
Sintaxe
lambda <params>: <expressao>
<params>é a mesma lista de parâmetros que umdefusaria — suporta defaults,*args,**kwargs.<expressao>é uma única expressão cujo valor se torna o valor de retorno.
Exemplos:
Sem palavra-chave return. O valor da expressão é retornado implicitamente.
A única limitação
Uma lambda pode conter apenas uma expressão. Você não pode colocar instruções:
Mas você pode usar a expressão ternária:
Se precisa de mais de uma expressão, é seu sinal para mudar para def.
Onde lambdas de fato se justificam
Uma lambda atribuída a uma variável é quase sempre pior do que um def nomeado:
Isso é estritamente pior do que def double(x): return x * 2 — mesma legibilidade, mais a versão lambda dá aos debuggers o nome pouco útil <lambda> nos stack traces.
Lambdas brilham em exatamente um lugar: como argumentos inline para funções de ordem superior.
Chaves de ordenação customizadas
O caso clássico:
O argumento key do sorted quer uma função que recebe um item e retorna o valor a ordenar. Uma lambda de uma linha é exatamente certa — e usar um def completo ia pesar para algo tão pequeno.
Você pode ordenar por vários campos usando uma tupla:
min, max, filter, map
História parecida — todos aceitam um argumento de função opcional:
Para map e filter, uma list comprehension geralmente é ainda mais clara:
A maioria dos pythonistas prefere comprehensions a map/filter por essa razão. lambda continua sendo encaixe natural para sorted, min e max onde não há atalho com comprehension.
Lambdas e operator
Quando sua lambda é só "pegue uma chave" ou "pegue um atributo", o módulo operator do Python tem alternativas mais rápidas e claras:
Não é ganho enorme, mas em código que já importa operator lê um pouco mais declarativo.
Quando voltar para def
Se qualquer uma destas é verdadeira, escreva um def:
- A lógica não encaixa limpa numa única expressão.
- Você quer dar nome à função porque o nome ajudaria na legibilidade.
- Você usaria a mesma lógica em mais de um lugar.
- A função precisa de docstring (lambdas não podem carregar uma).
Lembre: Python não é pontuado por número de linhas. Uma função nomeada de três linhas quase sempre lê melhor do que uma lambda de uma linha quando a lógica não é trivial.
Próxima: Decoradores
Lambdas passam funções como valores. Decoradores levam a mesma ideia um passo adiante: deixam você envolver qualquer função com comportamento reutilizável — logging, timing, cache, auth — usando um único @ na linha acima. Essa é a próxima página.
Perguntas frequentes
O que é uma lambda em Python?
Uma lambda é uma função curta e anônima que você pode escrever numa linha só. lambda x: x * 2 é equivalente a def double(x): return x * 2, exceto sem nome. É mais útil quando você precisa de uma função minúscula como argumento para outra função.
Quando devo usar lambda em vez de def?
Use lambda para funções de uma única vez, de uma expressão, que você passa direto para algo como sorted, max ou filter. Para qualquer coisa com um corpo mais longo do que uma expressão — ou qualquer coisa a que você daria nome — use def. Funções nomeadas quase sempre são mais claras.
Quais os limites da lambda?
Uma lambda pode conter apenas uma expressão, não instruções. Sem atribuições, sem blocos if (embora você possa usar o ternário a if cond else b), sem lógica multi linha. Se está brigando com esses limites, mude para def.