Hoje, vou começar uma série de posts que tem como finalidade mostrar um pouco das ferramentas de programação funcional que Python propicia aos programadores. O post de hoje é sobre lambda mas pretendo no futuro falar um pouco sobre filter, map, reduce, any, all, list comprehension, etc.
Python permite a criação de funções anônimas através do construtor lambda. Funções definidas por lambda possuem apenas uma linha e seu corpo deve conter apenas expressões. Quem já teve contato com alguma linguagem funcional talvez já tenha se deparado com elas
(a-> a+1) 5 -- Haskell (lambda (arg) (+ arg 1) 5) ;Lisp
Ambas funções incrementam em um o valor recebido como argumento, logo o retorno seria 6.
O mesmo exemplo com Python
>>> (lambda x: x+1) (5) 6
Funções lambdas são criadas da seguinte forma
lambda arg1,arg2,arg3,argn: expressão
Utilizando def a função correspondente seria
def func(arg1,arg2,arg3,argn): return expressão
Também é possível nomea-las
>>> quadrado = (lambda x = x**2) >>> quadrado(3) 4
e atribuir argumentos opcionais
>>> (lambda x,y=1: x**y) (2) 2 >>> (lambda x,y=1: x**y) (2,2) 4
Funções lambdas são frequentemente utilizadas em callback
#http://effbot.org/zone/tkinter-callbacks.htm def callback(numero): print "botão",numero Button(text="um";,command=lambda: callback(1)).pack() Button(text="dois",command=lambda: callback(2)).pack() Button(text="tres",command=lambda: callback(3)).pack()
e como argumento nas funções map,filter e reduce
>>> map(lambda x : (x**2)+x,[2,4,6]) [6,20,42]
É importante frisar que a sua utilização é inteiramente opcional (sempre poder usar a instrução def). Porém o uso de funções lambdas se torna útil na criação de funções simples e de uso exclusivo.
Necessário lembrar que
- O corpo da função deve ser uma expressão, não uma instrução;.
- Nas funções lambdas não existe uma instrução return. O valor retornado pela função é o valor da expressão no corpo da função.
- Possui apenas uma linha.
Links
http://docs.python.org/reference/expressions.html#lambda
http://diveintopython.org/power_of_introspection/lambda_functions.html
http://www.secnetix.de/olli/Python/lambda_functions.hawk
Rodrigo Lira