Funções lambda
Esta aula aborda funções lambda em Python, explicando sua sintaxe, usos comuns e limitações. Você aprenderá como criar funções anônimas de uma linha e aplicá-las com map, filter e sorted, além de entender quando evitá-las.
Funções lambda são funções anônimas e concisas em Python, definidas em uma única linha usando a palavra-chave lambda. Elas são úteis para operações simples e descartáveis, especialmente como argumentos para funções de ordem superior. Nesta aula, exploraremos sua sintaxe, casos de uso prático com map, filter e sorted, e suas limitações.
Diferentemente de funções definidas com def, lambdas não têm nome e não podem conter comandos múltiplos ou anotações de tipo. Elas são limitadas a uma única expressão, cujo resultado é retornado automaticamente.
Sintaxe
A sintaxe de uma função lambda é: lambda argumentos: expressão. Os argumentos são separados por vírgulas, e a expressão é avaliada e retornada. Não é necessário usar a palavra return.
Exemplos básicos:
# Lambda que soma dois números
soma = lambda a, b: a + b
print(soma(3, 5)) # 8
# Lambda sem argumentos
constante = lambda: 42
print(constante()) # 42
# Lambda com um argumento (quadrado)
quadrado = lambda x: x**2
print(quadrado(7)) # 49Lambdas são frequentemente usadas inline, sem atribuição a uma variável, como veremos a seguir.
Quando usar
Lambdas são ideais para funções pequenas e temporárias, especialmente quando passadas como argumento para funções de ordem superior (como map, filter, sorted). Elas tornam o código mais conciso e legível quando a lógica é simples.
Evite lambdas quando a função for complexa (mais de uma expressão), precisar de documentação, ou for reutilizada em vários lugares. Nesses casos, prefira uma função nomeada com def. Exemplo de uso adequado:
# Ordenar lista de tuplas pelo segundo elemento
dados = [(1, 'z'), (2, 'a'), (3, 'm')]
dados_ordenados = sorted(dados, key=lambda item: item[1])
print(dados_ordenados) # [(2, 'a'), (3, 'm'), (1, 'z')]Lambdas também são úteis em expressões de compreensão de listas e com funções como reduce (do módulo functools).
map, filter, sorted com lambda
As funções map, filter e sorted são frequentemente usadas com lambdas para transformar ou filtrar dados de forma funcional.
map: Aplica uma função a cada item de um iterável e retorna um iterador.
# Elevar ao quadrado cada número
numeros = [1, 2, 3, 4]
quadrados = list(map(lambda x: x**2, numeros))
print(quadrados) # [1, 4, 9, 16]filter: Filtra itens de um iterável com base em uma função que retorna True/False.
# Filtrar números pares
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares) # [2, 4]sorted: Ordena um iterável com base em uma função chave.
# Ordenar strings pelo tamanho
palavras = ['casa', 'abacaxi', 'sol', 'paralelepipedo']
ordenado = sorted(palavras, key=lambda s: len(s))
print(ordenado) # ['sol', 'casa', 'abacaxi', 'paralelepipedo']Limitações
Lambdas têm limitações importantes: (1) Apenas uma expressão — não podem conter comandos como if (exceto expressão condicional ternária), loops, ou múltiplas linhas. (2) Sem anotações de tipo — não é possível especificar tipos dos argumentos ou retorno. (3) Sem documentação — não podem ter docstrings. (4) Dificuldade de debug — lambdas não têm nome, então mensagens de erro podem ser menos claras. (5) Legibilidade prejudicada — lambdas complexas tornam o código difícil de entender.
Exemplo de má prática:
# Evite: lambda complexa com condicional ternário
# Prefira uma função nomeada
resultado = map(lambda x: x*2 if x > 0 else x*3, numeros)
# Melhor:
def ajustar(x):
if x > 0:
return x * 2
else:
return x * 3
resultado = map(ajustar, numeros)Em geral, use lambdas para operações simples e curtas; para lógica mais elaborada, crie funções com def.
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
Crie uma lista de números de 1 a 10. Use
mapcom uma lambda para obter uma lista com o cubo de cada número.✓ Resposta:numeros = list(range(1, 11)) cubos = list(map(lambda x: x**3, numeros)) print(cubos) # [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]Dada uma lista de strings, use
filtercom uma lambda para manter apenas as strings que começam com a letra 'a' (maiúscula ou minúscula).✓ Resposta:palavras = ['Ana', 'bola', 'abelha', 'casa', 'árvore', 'Avião'] filtradas = list(filter(lambda s: s.lower().startswith('a'), palavras)) print(filtradas) # ['Ana', 'abelha', 'árvore', 'Avião']Ordene uma lista de dicionários representando pessoas (com chaves 'nome' e 'idade') pela idade (do mais novo para o mais velho) usando
sortede uma lambda.✓ Resposta:pessoas = [{'nome': 'João', 'idade': 30}, {'nome': 'Maria', 'idade': 25}, {'nome': 'Pedro', 'idade': 35}] pessoas_ordenadas = sorted(pessoas, key=lambda p: p['idade']) print(pessoas_ordenadas) # [{'nome': 'Maria', 'idade': 25}, {'nome': 'João', 'idade': 30}, {'nome': 'Pedro', 'idade': 35}]Use
mapcom uma lambda para converter uma lista de temperaturas em graus 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]Crie uma função lambda que receba dois números e retorne o maior deles. Use-a com
reduce(do módulofunctools) para encontrar o máximo de uma lista. Lembre-se de importarreduce.✓ Resposta:from functools import reduce numeros = [10, 5, 8, 20, 3] maior = reduce(lambda a, b: a if a > b else b, numeros) print(maior) # 20