Funções lambda em Python: quando usar (e quando evitar)
Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução
Imagine que você precisa deixar um recado rápido para alguém: "Volto em 5 minutos". Você não escreveria uma carta formal, com saudação, três parágrafos e assinatura. Você rabiscaria num post-it e pronto.
As funções lambda são os post-its do Python. São funções minúsculas, anônimas e descartáveis, para quando você precisa de algo rápido em uma linha e um bloco def completo seria exagero.
Neste tutorial, você vai aprender a escrever funções lambda, onde elas brilham (ordenar, filtrar, mapear) e, tão importante quanto, quando é melhor deixá-las de lado e usar uma função comum.
Como escrever uma função lambda
Uma função lambda é criada com a palavra-chave lambda, seguida dos parâmetros, de dois-pontos e de uma única expressão. Essa expressão é retornada automaticamente: não é preciso usar a palavra-chave return.
10 10
A sintaxe é: lambda parameters: expression. Não há nome de função (é por isso que elas são chamadas de "anônimas"), nem def, nem return, nem corpo com várias linhas. Só uma expressão, que é avaliada e retornada.
As lambdas podem receber vários parâmetros, como as funções comuns:
10 Ada Lovelace
Usando lambda com sorted()
O uso mais comum das funções lambda é como argumento key do sorted(). O parâmetro key diz ao Python: "antes de comparar os itens, transforme cada um com esta função".
['Bob', 'Charlie', 'alice'] ['alice', 'Bob', 'Charlie']
A lambda lambda name: name.lower() diz ao sorted() para comparar as versões em minúsculas de cada string. As strings originais continuam iguais: a lambda só afeta a comparação.
As lambdas são especialmente úteis para ordenar dados complexos, como listas de tuplas ou de dicionários:
Charlie: 72 Alice: 88 Diana: 91 Bob: 95
Mouse: $25 Keyboard: $75 Laptop: $999
Usando lambda com map() e filter()
map() aplica uma função a cada item de uma lista e devolve os resultados transformados. filter() mantém só os itens para os quais a função retorna True. As duas recebem uma função como primeiro argumento: o lugar perfeito para uma lambda.
[2, 4, 6, 8, 10] [2, 4]
Envolvemos map() e filter() com list() porque elas retornam iteradores preguiçosos (que só calculam cada valor quando ele é pedido), e não listas. A chamada de list() obriga os dois a produzir todos os resultados de uma vez.
Agora um exemplo mais prático, que extrai e filtra dados:
[11.55, 26.39, 5.5, 49.5, 14.03] [23.99, 45.0]
doubled = list(map(
lambda x: x * 2, numbers
))
evens = list(filter(
lambda x: x % 2 == 0, numbers
))doubled = [x * 2 for x in numbers]
evens = [x for x in numbers
if x % 2 == 0]Lambda vs. def: quando usar cada uma
As lambdas são tentadoras porque parecem espertas e compactas. Mas elas têm limitações reais. Veja quando usar cada uma:
Use lambda quando:
key=, map() ou filter()Use def quando:
if/else, laços ou tratamento de erros['apple', 'banana', 'cherry'] ['apple', 'banana', 'cherry']
Padrões comuns com lambda
Aqui estão alguns padrões que você vai encontrar em código Python de verdade. Reconhecê-los vai ajudar você a ler o código de outras pessoas e a saber quando uma lambda é a ferramenta certa.
Alex: 30 Zara: 22
even odd
awesome is
Exercícios práticos
O que este código exibe? Digite a saída exata.
operation = lambda a, b: a * b + 1
print(operation(3, 4))
print(operation(0, 10))Dada uma lista de palavras, use sorted() com uma lambda para ordená-las pelo último caractere. Exiba a lista ordenada resultante.
Use esta lista: words = ['hello', 'world', 'python', 'code']
Saída esperada: ['world', 'code', 'python', 'hello']
Dada uma lista de números, use filter() com uma lambda para manter só os números maiores que 10 e depois use map() com uma lambda para elevar ao quadrado cada número restante. Exiba a lista final.
Use esta lista: numbers = [3, 15, 7, 20, 8, 12]
Saída esperada: [225, 400, 144]
Dada uma lista de tuplas de alunos (name, gpa), ordene-as pela média (GPA) da maior para a menor usando sorted() com uma lambda. Exiba cada aluno em uma linha separada, no formato name: gpa.
Use esta lista:
students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]Saída esperada:
Bob: 3.9
Diana: 3.7
Alice: 3.5
Charlie: 3.2Dada uma lista de palavras, use sorted() com uma lambda para ordená-las pelo tamanho (as mais curtas primeiro). Se duas palavras tiverem o mesmo tamanho, elas devem aparecer em ordem alfabética. Exiba a lista ordenada.
Use esta lista: words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']
Saída esperada: ['fig', 'date', 'kiwi', 'pear', 'plum', 'apple', 'banana']