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

5 Thoughts on “Entendendo Python: Lambda

  1. Elder S. Trevisan on 10/01/2015 at 9:13 pm said:

    Muito boa a explicação, gostei. Esse último exemplo me lembrou switch. É possível criar switchs dessa maneira?

    • Nicholas Amorim on 10/01/2015 at 10:57 pm said:

      Obrigado, Elder. Caso tenha sugestões de artigos Python, só dizer que procurarei escrever! Uma implementação real do switch em python é complicada… Mas pra todo efeito sim, você poderia isso como um switch, eu gosto de usar essa solução quando para cada input diferente, eu tenho um pequena função anônima agindo sobre ele. Mas potencialmente, você pode usar como qualquer coisa. Para outras ideias, dá uma olhada nessa resposta do Stack Overflow. http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python

      • Elder S. Trevisan on 11/01/2015 at 11:43 am said:

        Bom, já que falou, que tal uma matéria dando uma boa explicação aobre callbacks, com exemplos simples e exemplos do mundo real. Até o momento não achei um material bem explicativo sobre esse tema.

        • Nicholas Amorim on 11/01/2015 at 11:46 am said:

          Você quer dizer uma simples implementação de callback ou callbacks do Twisted ?

          • Elder S. Trevisan on 11/01/2015 at 12:14 pm said:

            Então, como não manjo nada de callbacks, acredito que seja simples. Se não me engano, callbacks é quando você passa função como parâmetro para outra função né?

Deixe uma resposta para Nicholas Amorim Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Post Navigation