Funções lambda
Esta aula explica o conceito de funções lambda em Python, uma forma concisa de criar funções anônimas. Abordamos a sintaxe, quando utilizá-las e exemplos práticos com map, filter e sorted, além de suas limitações.
Funções lambda são funções anônimas definidas em uma única linha, sem necessidade de usar a palavra-chave def. Elas são úteis para operações simples e temporárias, especialmente em contextos de programação funcional.
Nesta aula, vamos explorar a sintaxe, os casos de uso mais comuns e as limitações das funções lambda, com exemplos práticos que mostram como integrá-las com map, filter e sorted.
Sintaxe
A sintaxe de uma função lambda é: lambda argumentos: expressão. A expressão é avaliada e retornada automaticamente. Não é permitido usar comandos ou múltiplas expressões; apenas uma única expressão.
Exemplo básico:
# Função lambda que dobra um número
dobro = lambda x: x * 2
print(dobro(5)) # 10
# Equivalente com def
def dobro_def(x):
return x * 2
print(dobro_def(5)) # 10É possível ter múltiplos argumentos, separados por vírgula:
soma = lambda a, b: a + b
print(soma(3, 4)) # 7Quando usar
Funções lambda são ideais quando você precisa de uma função simples por um curto período, especialmente como argumento para funções de ordem superior como map, filter e sorted. Elas tornam o código mais conciso e legível quando a lógica é trivial.
No entanto, se a lógica for complexa ou precisar de múltiplas linhas, é melhor usar uma função definida com def. Lambda não deve ser usada para funções reutilizáveis ou que exigem documentação.
Exemplo de uso adequado:
# Ordenar lista de tuplas pelo segundo elemento
pessoas = [('Ana', 25), ('João', 20), ('Maria', 30)]
pessoas_ordenadas = sorted(pessoas, key=lambda p: p[1])
print(pessoas_ordenadas) # [('João', 20), ('Ana', 25), ('Maria', 30)]map, filter, sorted com lambda
As funções map, filter e sorted aceitam uma função como primeiro argumento. Lambda é frequentemente usada para defini-la rapidamente.
map
map aplica uma função a cada elemento de um iterável e retorna um iterador. Exemplo:
numeros = [1, 2, 3, 4]
quadrados = list(map(lambda x: x ** 2, numeros))
print(quadrados) # [1, 4, 9, 16]filter
filter seleciona elementos que satisfazem uma condição (função retorna True). Exemplo:
numeros = [1, 2, 3, 4, 5, 6]
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares) # [2, 4, 6]sorted
sorted ordena um iterável. O parâmetro key especifica uma função que extrai o critério de ordenação. Exemplo:
palavras = ['banana', 'maçã', 'abacaxi', 'uva']
# Ordenar pelo tamanho da palavra
ordenadas = sorted(palavras, key=lambda s: len(s))
print(ordenadas) # ['uva', 'maçã', 'banana', 'abacaxi']Limitações
As funções lambda têm várias limitações importantes:
- Apenas uma expressão: não podem conter comandos como
if(semelse), loops, ou múltiplas linhas. - Não possuem nome, o que dificulta o rastreamento em erros (traceback mostra
). - Não podem conter anotações de tipo (type hints) ou docstrings.
- Não são adequadas para lógica complexa; reduzem a legibilidade se usadas em excesso.
Exemplo de lambda que tenta usar if (incorreto):
# Isso não funciona: lambda não pode ter if sem else
# maior = lambda a, b: if a > b: a else b # SyntaxError
# Correto usando expressão condicional:
maior = lambda a, b: a if a > b else b
print(maior(10, 20)) # 20Mesmo assim, para funções mais complexas, prefira def:
def maior(a, b):
if a > b:
return a
else:
return bBoas práticas
- Use lambda apenas para operações simples e descartáveis.
- Se a função for usada mais de uma vez, transforme-a em uma função nomeada.
- Evite aninhar lambdas; isso prejudica a legibilidade.
- Prefira funções nomeadas em módulos ou classes para reutilização.
Referências
- Documentação oficial: Expressões lambda
- Documentação oficial: map
- Documentação oficial: filter
- Documentação oficial: sorted
- Real Python: Python Lambda Functions
- W3Schools: Python Lambda
Exercícios
Escreva uma função lambda que retorne o cubo de um número.
✓ Resposta:cubo = lambda x: x ** 3 print(cubo(3)) # 27Use
mapcom uma função lambda para converter uma lista de temperaturas em Celsius para Fahrenheit. Fórmula: F = C * 9/5 + 32.✓ Resposta:celsius = [0, 20, 30, 40] fahrenheit = list(map(lambda c: c * 9/5 + 32, celsius)) print(fahrenheit) # [32.0, 68.0, 86.0, 104.0]Use
filtercom lambda para extrair de uma lista de strings aquelas que têm mais de 5 caracteres.✓ Resposta:palavras = ['casa', 'carro', 'bicicleta', 'sol', 'python'] longas = list(filter(lambda s: len(s) > 5, palavras)) print(longas) # ['bicicleta', 'python']Ordene uma lista de dicionários pela chave 'idade' usando
sortede lambda.✓ Resposta:pessoas = [{'nome': 'Ana', 'idade': 25}, {'nome': 'João', 'idade': 20}, {'nome': 'Maria', 'idade': 30}] ordenado = sorted(pessoas, key=lambda p: p['idade']) print(ordenado) # [{'nome': 'João', 'idade': 20}, {'nome': 'Ana', 'idade': 25}, {'nome': 'Maria', 'idade': 30}]Explique por que o código abaixo causa erro e corrija-o usando uma expressão condicional.
# Código com erro maior = lambda a, b: if a > b: a else b✓ Resposta:O erro ocorre porque lambda não aceita comandos
if(semelse). A correção é usar a expressão condicional (operador ternário):maior = lambda a, b: a if a > b else b print(maior(10, 20)) # 20