Neste guia completo, você irá explorar o universo das funções lambda em Python, desde a sua sintaxe básica até as diversas aplicações práticas, acompanhadas de exemplos de código.
Em Python, as lambdas são funções anônimas, caracterizadas por sua sintaxe enxuta e versatilidade, podendo ser combinadas com outras funções nativas da linguagem. Ao concluir este tutorial, você terá domínio sobre a criação de funções lambda e saberá discernir quando seu uso é mais apropriado do que o de funções Python convencionais.
Vamos começar!
Funções Lambda em Python: Sintaxe e Ilustrações
A estrutura geral para a definição de uma função lambda em Python é a seguinte:
lambda parâmetro(s): valor de retorno
Na estrutura acima:
- A palavra-chave
lambda
inicia a definição da função, seguida por um ou mais parâmetros que a função receberá. - Os parâmetros e o valor de retorno são separados por dois pontos.
💡 É crucial lembrar que o valor de retorno de uma função lambda deve ser o resultado de uma expressão avaliada em uma única linha de código. Os exemplos a seguir ajudarão a esclarecer esse conceito.
Exemplos Práticos de Funções Lambda
A melhor forma de internalizar o conceito de funções lambda é convertendo funções Python regulares para o formato lambda.
👩🏽💻 Sinta-se à vontade para testar o código em um ambiente Python REPL ou no editor Python online do etechpt.com.
#1. Analisemos a função square()
, que aceita um número (num
) e retorna seu quadrado.
def square(num): return num*num
Você pode invocar a função com diferentes argumentos para verificar seu funcionamento:
>>> square(9) 81 >>> square(12) 144
Podemos associar essa expressão lambda a uma variável, como square1
, para tornar a definição mais compacta: square1 = lambda num: num*num
. Contudo, sendo as lambdas funções anônimas, é recomendável evitar atribuí-las a variáveis.
Na função square()
, num
é o parâmetro, e num*num
é o valor de retorno. Com isso, podemos traduzir a função para o formato lambda e executá-la diretamente:
>>> (lambda num: num*num)(2) 4
Este é um exemplo do conceito de Expressão de Função Invocada Imediatamente, onde a função é chamada logo após sua definição.
#2. Agora, vamos transformar a função add()
, que recebe dois números (num1
e num2
) e retorna sua soma.
def add(num1,num2): return num1 + num2
Vamos testar a função add()
com diferentes pares de números:
>>> add(4,3) 7 >>> add(12,5) 17 >>> add(12,6) 18
Neste caso, num1
e num2
são os parâmetros, e num1 + num2
é o valor de retorno.
>>> (lambda num1, num2: num1 + num2)(3,7) 10
Funções em Python também podem ter parâmetros com valores padrão. Vamos modificar a função add()
e definir o valor padrão de num2
para 10.
def add(num1, num2=10): return num1 + num2
Nas seguintes chamadas:
- Na primeira chamada,
num1
é 1 enum2
é 3, e o resultado é 4. - Se apenas um argumento for fornecido, o valor padrão de
num2
(10) será usado. Por exemplo, ao chamaradd(7)
, o resultado é 17.
>>> add(1,3) 4 >>> add(7) 17
Ao usar funções que aceitam valores padrão como expressões lambda, é possível definir esses valores diretamente na definição dos parâmetros.
>>> (lambda num1, num2 = 10: num1 + num2)(1) 11
Quando Usar Funções Lambda em Python?
Agora que você já tem uma base sobre as funções lambda, veja alguns cenários onde elas são mais adequadas:
- Quando você precisa de uma função cuja expressão de retorno seja concisa, de uma única linha, e que não precise ser referenciada em outros pontos do mesmo módulo.
- Em conjunto com funções como
map()
,filter()
ereduce()
. - Para personalizar a ordenação de estruturas de dados em Python, como listas e dicionários.
Funções Lambda com Funções Nativas
1. Lambda com map()
A função map()
aplica uma função a cada elemento de um iterável, gerando um novo iterável:
Vamos criar uma lista de números e usar map()
para gerar uma nova lista contendo o quadrado de cada número. Aqui, usamos uma função lambda para definir a operação de elevar ao quadrado.
>>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]
Como a função map()
retorna um objeto do tipo map, ele é convertido para uma lista.
▶️ Consulte este guia sobre a função map()
em Python.
2. Lambda com filter()
Inicialmente, definimos uma lista de números chamada nums
:
>>> nums = [4,5,6,9]
Suponha que você queira extrair apenas os números ímpares dessa lista.
A função filter()
é ideal para isso. Ela recebe uma condição e um iterável e retorna um novo iterável contendo apenas os elementos que satisfazem a condição.
Para filtrar os números pares, mantendo apenas os ímpares, a expressão lambda deve ser lambda num: num%2!=0
. O operador %
calcula o resto da divisão por 2.
num%2!=0
éTrue
para números ímpares enum%2!=0
éFalse
para números pares.
>>> nums = [4,5,6,9] >>> list(filter(lambda num:num%2!=0,nums)) [5, 9]
3. Lambda com reduce()
A função reduce()
recebe um iterável e uma função e reduz iterativamente os elementos aplicando a função.
Para usar reduce()
, é necessário importá-la do módulo functools
:
>>> from functools import reduce
Utilizaremos reduce()
para calcular a soma de todos os números da lista nums
. A função lambda lambda num1,num2:num1+num2
define a operação de soma.
A operação de redução se dará da seguinte forma: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24, onde f é a operação de soma, definida pela lambda.
>>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24
Personalização de Ordenação com Funções Lambda
Além de usar lambdas com funções nativas como map()
, filter()
e reduce()
, você também pode utilizá-las para personalizar métodos de ordenação.
1. Ordenando Listas em Python
Ao trabalhar com listas, é comum a necessidade de ordená-las de acordo com critérios específicos. Para ordenar a lista no mesmo local, pode-se usar o método sort()
. Se você precisa de uma cópia ordenada da lista, utilize sorted()
.
A sintaxe da função sorted()
é sorted(iterable, key=…, reverse= True | False)
.
O parâmetro key
personaliza a ordenação e o parâmetro reverse
define se a ordem será crescente (False
, padrão) ou decrescente (True
).
A ordenação padrão de listas de números e strings é em ordem crescente e alfabética, respectivamente. No entanto, é possível usar critérios customizados.
Considere a lista de frutas a seguir. Vamos ordená-la com base no número de ocorrências da letra ‘p’, em ordem decrescente.
>>> fruits = ['apple','pineapple','grapes','mango']
Nesse caso, vamos usar o parâmetro key
. Strings em Python são iteráveis e podemos usar o método .count()
para contar o número de ocorrências de um caractere. Definimos key
como lambda x:x.count('p')
para ordenar com base no número de ‘p’ em cada string.
>>> fruits = ['apple','pineapple','grapes','mango'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['pineapple', 'apple', 'grapes', 'mango']
Neste exemplo:
- O critério de ordenação é o número de ocorrências da letra ‘p’, definido por uma função lambda.
- O parâmetro
reverse
sendoTrue
garante a ordem decrescente.
Na lista, ‘pineapple’ tem 3 ocorrências de ‘p’, ‘apple’ e ‘grapes’ têm 2 e 1, respectivamente, e ‘mango’ não tem nenhuma.
Entendendo a Ordenação Estável
Vamos analisar outro exemplo, usando a mesma lógica de ordenação e uma nova lista de frutas. Agora, ‘p’ aparece duas vezes em ‘apple’ e uma vez em ‘grapes’, e não aparece em ‘mango’ e ‘melon’.
>>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']
Na saída, ‘mango’ aparece antes de ‘melon’, mesmo que ambos não tenham ‘p’. Isso acontece porque sorted()
executa uma ordenação estável. Se dois elementos tiverem o mesmo valor para a chave de ordenação, a ordem relativa original é preservada.
Como um exercício, inverta a posição de ‘mango’ e ‘melon’ na lista original, rode novamente a ordenação e observe a saída.
▶️ Para saber mais sobre ordenação de listas em Python, consulte este guia.
2. Ordenando um Dicionário Python
Você também pode utilizar lambdas para ordenar dicionários. Considere o dicionário price_dict
, que mapeia itens aos seus preços.
>>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }
Para obter os pares chave-valor de um dicionário como uma lista de tuplas, use o método .items()
:
>>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])
Em Python, iteráveis como listas e tuplas usam indexação baseada em zero. O primeiro item está no índice 0, o segundo no índice 1, e assim por diante.
Nosso objetivo é ordenar os itens pelo valor, ou seja, pelo preço. Em cada tupla de price_dict_items
, o preço está no índice 1. Definimos a chave como lambda x:x[1]
para que a ordenação se baseie no preço.
>>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}
Na saída, os itens estão em ordem crescente de preço: começando com ‘Candy’ (preço 3) e terminando com ‘Honey’ (preço 15).
▶️ Explore este guia completo para saber como ordenar dicionários Python por chave e valor.
Conclusão
E aqui está! Você aprendeu a definir funções lambda e usá-las de forma eficaz com outras funções nativas do Python. Aqui está um resumo das principais conclusões:
- Lambdas são funções anônimas que aceitam vários argumentos e retornam um valor; a expressão que gera este valor deve estar em uma única linha de código. Elas são úteis para definir funções pequenas e concisas.
- Use a sintaxe
lambda parâmetro(s): valor de retorno
para definir uma função lambda. - Algumas aplicações comuns são em conjunto com
map()
,filter()
ereduce()
, e como o parâmetrokey
para personalizar a ordenação de iteráveis.
Em seguida, aprenda como executar a divisão inteira em Python.