Um pouco de funcional

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