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

Quando 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 (sem else), 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))  # 20

Mesmo assim, para funções mais complexas, prefira def:

def maior(a, b):
    if a > b:
        return a
    else:
        return b

Boas 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

Exercícios

  1. Escreva uma função lambda que retorne o cubo de um número.

    ✓ Resposta:
    cubo = lambda x: x ** 3
    print(cubo(3))  # 27
  2. Use map com 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]
  3. Use filter com 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']
  4. Ordene uma lista de dicionários pela chave 'idade' usando sorted e 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}]
  5. 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 (sem else). 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