Expressões Lambda do Python

Resumo: neste tutorial, você aprenderá sobre as expressões lambda do Python e como usá-las para escrever funções anônimas.

Às vezes, você precisa escrever uma função simples que contenha uma expressão. No entanto, você precisa usar esta função uma vez. E será desnecessário definir essa função com a palavra-chave def.

É aí que as expressões lambda do Python entram em ação.

O que são expressões lambda do Python

As expressões lambda do Python permitem que você defina funções anônimas.

Funções anônimas são funções sem nomes. As funções anônimas são úteis quando você precisa usá-las uma vez.

Uma expressão lambda geralmente contém um ou mais argumentos, mas pode ter apenas uma expressão.

Veja a seguir a sintaxe da expressão lambda:

lambda parameters: expression

É equivalente à seguinte função sem o nome "anonymous":

def anonymous(parameters):
    return expression

Exemplos de expressão lambda do Python

Em Python, você pode passar uma função para outra função ou retornar uma função de outra função.

1) Funções que aceitam um exemplo de função

O seguinte define uma função chamada get_full_name() que formata o nome completo do primeiro nome e sobrenome:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)

A função get_full_name() aceita três argumentos:

  • Nome (first_name)
  • Sobrenome (last_name)
  • Uma função que irá formatar o nome completo (formatter). Por sua vez, a função formatter aceita dois argumentos nome e sobrenome.

O seguinte define duas funções que retornam um nome completo do primeiro nome e sobrenome em diferentes formatos:

def first_last(first_name, last_name):
    return f"{first_name} {last_name}"


def last_first(first_name, last_name):
    return f"{last_name}, {first_name}"

E isso mostra como chamar a função get_full_name() passando o nome, o sobrenome e as funções first_last/last_first:

full_name = get_full_name('John', 'Doe', first_last)
print(full_name) # John Doe

full_name = get_full_name('John', 'Doe', last_first)
print(full_name) #  Doe, John

Saída:

John Doe
Doe, John

Em vez de definir as funções first_last e last_first, você pode usar expressões lambda.

Por exemplo, você pode expressar a função first_last usando a seguinte expressão lambda:

lambda first_name,last_name: f"{first_name} {last_name}"

Essa expressão lambda aceita dois argumentos e os concatena em uma string formatada na ordem first_name, espaço e last_name.

E o seguinte converte a função last_first usando uma expressão lambda que retorna o nome completo no formato: sobrenome, espaço e nome:

lambda first_name, last_name: f"{last_name} {first_name}";

Usando expressões lambda, você pode chamar a função get_full_name() da seguinte maneira:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)


full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{first_name} {last_name}"
)
print(full_name)

full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{last_name} {first_name}"
)
print(full_name)

Saída:

John Doe
Doe, John

2) Funções que retornam um exemplo de função

A função times() a seguir retorna uma função que é uma expressão lambda:

def times(n):
    return lambda x: x * n

E este exemplo mostra como chamar a função times():

double = times(2)

Como a função times() retorna uma função, a double também é uma função. Para chamá-la, você coloca parênteses assim:

result = double(2)
print(result)

result = double(3)
print(result)

Saída:

4
6

O seguinte mostra outro exemplo de uso da função times():

triple = times(3)

print(triple(2))  # 6
print(triple(3))  # 9

Python lambda em um loop

Veja o seguinte exemplo:

callables = []
for i in (1, 2, 3):
    callables.append(lambda: i)

for f in callables:
    print(f())

Como funciona.

  • Primeiro, defina uma lista com o nome callables.
  • Em segundo lugar, itere de 1 a 3, crie uma nova expressão lambda em cada iteração e adicione-a à lista de chamadas.
  • Em terceiro lugar, faça um loop sobre os callables e chame cada função.

A saída esperada será:

1
2
3

No entanto, o programa mostra a seguinte saída:

3
3
3

O problema é que todas as expressões lambda referenciam a variável i, não o valor atual de i. Quando você chama as expressões lambda, o valor da variável i é 3.

Para corrigir isso, você precisa vincular a variável i a cada expressão lambda no momento em que a expressão lambda é criada. Uma maneira de fazer isso é usar o argumento padrão:

callables = []
for i in (1, 2, 3):
    callables.append(lambda a=i: a)

for f in callables:
    print(f())

Neste exemplo, o valor de a é avaliado no momento em que a expressão lambda é criada. Portanto, o programa retorna a saída esperada.

Resumo

  • Use expressões lambda do Python para criar funções anônimas, que são funções sem nomes.
  • Uma expressão lambda aceita um ou mais argumentos, contém uma expressão e retorna o resultado dessa expressão.
  • Use expressões lambda para passar funções anônimas para uma função e retornar uma função de outra função.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *