Entendendo Python: Lambda

O que é lambda ?

Lambda não é nada mais que funções anônimas que aceitam argumentos (inclusive opcionais) e que só suportam uma expressão. Ao executar lambda, Python retorna uma função ao invés de atribuí-la à um nome como acontece com def, por isso são anônimas. O conceito e o nome são emprestados de Lisp, uma linguagem funcional.

Hum…. Quê ?

Basicamente, você vai usar lambda quando precisar de uma função que não seja seja complexa o suficiente para criá-la com def. Você pode pensar em lambdas como funções de uma linha só. Como muitas coisas na vida real, é melhor ver na prática para entender. Vamos começar transformando uma função que recebida uma lista de palavras, devolve uma lista com o tamanho de cada uma das palavras.

def size_each(words):
    return [len(w) for w in words]
 
words = ['look', 'so', 'car', 'ice', 'melted']
 
print size_each(words)
>>> [4, 2, 3, 3, 6]
 
size_each = lambda words: [len(w) for w in words]
 
print size_each(words)
>>> [4, 2, 3, 3, 6]

Viu só ? É simples como parece. lambda cria uma função e atribuí ela a variável size_each que passa a ter a função anônima, bastando executá-la; return é implícito. Lambda toma a forma de:

lambda argumento1, argumento2,… argumentoN :expressão usando argumentos

Lambda é uma expressão – Por causa disso, lambda pode aparecer em lugar que um def não pode – dentro de uma lista ou nos argumentos de chamada de uma função, por exemplo. Tal como uma expressão, retorna algo e esse algo é a função em si.

Mundo real

Exemplos didáticos sempre tendem a ser burocráticos e pouco inspirados em casos reais. Tentarei usar um exemplo mais prático aqui.

replace = True
func = replace and (lambda s: s.replace(' ', '_')) or (lambda s: s)
 
phrase = 'Look at the sky, blue mama'
 
print func(phrase)
>>> Look_at_the_sky_blue_mama

Ainda bem burocrático, mas ilustra um bom ponto. Se replace é True, retorna para func a primeira função lambda que aceita um argumento (s) e retorna o mesmo com a devida substituição feita… Se replace é false, retorna a segunda função que simplesmente retorna o argumenento (s) como ele é. Lembre-se, return é implícito em lambdas.

Você pode também ter um dicionário de ações usando lambda… Digamos:

actions = {
    'sum': lambda x, y: x + y,
    'sub': lambda x, y: x - y,
    'mul': lambda x, y: x * y,
}
 
func = actions['sum']
 
print func(10, 20)
>>> 30

Para finalizar, lambda é basicamente uma questão de estilo. Não são necessárias, mas podem ajudar seu código em termos de legibilidade e praticidade. Eu sempre uso lambdas ao invés de várias funções de uma linha só.

Espero que tenha ficado claro o suficiente e que possa usar lambda para melhorar seu código. Uma vez passado o susto inicial, lambdas podem ser suas melhores amigas ao lado de list comprehensions.

Use Facebook to Comment on this Post