Um pouco de funcional

10jul10

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

Anúncios


No Responses Yet to “Um pouco de funcional”

  1. Deixe um comentário

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: