map(), filter() e reduce() operam em listas. Mas se quisermos usá-los corretamente, teremos que passar primeiro pelas expressões lambda.
lambda
As expressões lambda são uma boa maneira de criar funções descartáveis! Apenas observe que eles não podem apresentar instruções de retorno, pois sua saída é a saída de retorno padrão.
# Observe a sintaxe
somar = lambda x, y: x + y
somar(2, 2) # Retorna 4
somar(4, 4) # Retorna 8
Como você pode ver, essa expressão lambda para somar é mais ou menos uma definição de função, transformando somar no nome de uma função.
Agora veremos como eles podem ser usados para criar funções anônimas arbitrárias.
# Define uma função cria uma função anônima e retorna a saída
def multiplica_por(n):
return lambda x : x * n
# A função que é criada multiplica a entrada por 8
multiplique_oito = multiplica_por(8)
# A função que é criada multiplica a entrada por 6
multiplique_seis = multiplica_por(6)
multiplique_oito(2) # Retorna 16 (ou seja, 2 * 8)
multiplique_seis(2) # Retorna 12 (ou seja, 2 * 6)
No entanto, a VERDADEIRA utilidade das expressões lambda vem quando você as emparelha com map(), filter(), reduce().
mapa()
Map pega uma lista de itens e aplica uma função a cada item da lista.
# Vamos fazer um mapa para elevar ao quadrado todos os números de uma lista!
numeros = [1, 2, 3, 4, 5]
# Observe o lambda! Não precisamos criar uma nova função nomeada para isso!
map(lambda x: x ** 2, numeros) # Isso cria um objeto de mapa
# Precisamos criar uma lista para isso!
my_squares = list(map(lambda x: x ** 2, numeros))
print(my_squares) # [1, 4, 9, 16, 25] Conseguimos!
# Vamos tentar mais um, para colocar tudo em maiúsculas em uma string de entrada
frase = "joao"
nova_frase = list(map(lambda x: x.upper(), frase))
print(nova_frase)
Saída —--------------------
[1, 4, 9, 16, 25]
['J', 'O', 'A', 'O']
filter()
O filter executa uma função em cada item de uma lista, criando uma nova lista de itens que atendem às condições definidas por essa função. Mais especificamente, os itens são adicionados à nova lista se a função aplicada retornar True
# Vamos filtrar os números que não são maiores que 3
numeros = [1, 2, 3, 4, 5]
print(list(filter(lambda x: x > 3, numeros)))
Saída —--------------------
[4, 5]
reduce()
O reduce() tem que ser importado antes de ser utilizado. O reduce() 'combina' itens em uma lista, executando uma função em cada item de uma lista.
A função que você usa para percorrer a lista precisa receber dois valores, sendo o primeiro o valor acumulado e o segundo o item atual pelo qual você está iterando na lista.
from functools import reduce
numeros = [1, 2, 3, 4]
# Lembre-se, o primeiro valor é o valor
# acumulado e o segundo é o valor atual
# Este adiciona todos os valores!
print(reduce(lambda x, y: x + y, numeros))
# Este multiplica todos os valores!
print(reduce(lambda x, y: x * y, numeros))
# Este concatena strings!
print(reduce(lambda x, y: x + y, ["Joao", "Futi"]))
Saída —--------------------
10
24
JoaoFuti
0 Comentários