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))  # 49

Lambdas 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

Exercícios

  1. Crie uma lista de números de 1 a 10. Use map com 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]
  2. Dada uma lista de strings, use filter com 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']
  3. Ordene uma lista de dicionários representando pessoas (com chaves 'nome' e 'idade') pela idade (do mais novo para o mais velho) usando sorted e 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}]
  4. Use map com 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]
  5. Crie uma função lambda que receba dois números e retorne o maior deles. Use-a com reduce (do módulo functools) para encontrar o máximo de uma lista. Lembre-se de importar reduce.

    ✓ 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