Como usar funções do Lambda em Python [With Examples]

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 e num2 é 3, e o resultado é 4.
  • Se apenas um argumento for fornecido, o valor padrão de num2 (10) será usado. Por exemplo, ao chamar add(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() e reduce().
  • 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 e
  • num%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 sendo True 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() e reduce(), e como o parâmetro key para personalizar a ordenação de iteráveis.

Em seguida, aprenda como executar a divisão inteira em Python.