Funções lambda
Funções de primeira classe
Em Python funções também são objetos, e podem ser utilizadas como qualquer outro objeto, ou seja, uma função pode ser passada como parâmetro para outra função.
# Digamos que tenhamos uma coleção de utilidades
def transforma_em_maiusculo(texto):
return texto.upper()
def transforma_em_minusculo(texto):
return texto.lower()
def divide_por_2(numero):
return numero // 2
# e nossa função principal
def faz_algo(valor, funcao):
return funcao(valor)
print(faz_algo("bruno", transforma_em_maiusculo))
# BRUNO
print(faz_algo("BRUNO", transforma_em_minusculo))
# bruno
print(faz_algo(10, divide_por_2))
# 5
E isso permite fazer uma enorme quantidade de composição de funções.
Funções anonimas
As vezes é conveniente passar uma função como parâmetro para outra função, mas não queremos que essa função seja definida, pois será uma função de uso único.
faz_algo(10, lambda x: x * 2)
# 20
faz_algo(10, lambda x: x // 2)
# 5
faz_algo("python é bom", lambda x: x.title())
# Python É Bom
A biblioteca padrão do Python utiliza deste recurso em uma grande parte de suas funções:
nomes = ["Bruno", "João", "Maria", "Carlos", "Erik"]
print(sorted(nomes, key=len)
# ['João', 'Erik', 'Bruno', 'Maria', 'Carlos']
filter(lambda x: x.startswith("B"), nomes)
# ['Bruno']
Algumas regras:
- A função
lambda
pode receber argumentos - A função
lambda
não pode retornar valor - A função
lambda
não DEVE ser definida como variável - A função
lambda
não pode ter mais de uma expressão
Protocolo callable
As funções fazem parte dos objetos que implementam o protocolo callable
, ao
longo do treinamento veremos outros objetos callable
e aprenderemos a
adicionar este protocolo aos objetos.
Para verificar se um objeto é callable
basta utilizar a função callable
:
print(callable(lambda x: x))
# True