martes, octubre 20, 2009

Python y programación funcional

La programación funcional es uno de los paradigmas que más me interesa dentro de los conocidos, me he divertido con lenguajes funcionales como Haskell, Erlang y un poquito de LISP. Pero dado que mi lenguaje preferido es Python, y además en el cual trabajo a diario, estuve divirtiéndome, buscando hacer las cosas lo más similar al estilo funcional. Y como era de esperar, Python me ha dado *casi* todo de lo que esperaba.

Veamos algunas formas de como Python se *acerca* a un mundo funcional:

Factorial


# utilizando lambdas y algunas cositas del paradigma imperativo
fact = lambda n: 1 if n <=0 else fact(n-1)*n

# algo un poquito más interesante
fact = lambda n: (1 and n <=0) or fact(n-1)*n

# utilizando reduce y lambdas
fact = lambda n: reduce(lambda x,y:x*y, xrange(1,n+1) or [1])

# pequeño cambio utilizando el modulo operator
import operator
fact = lambda n: reduce(operator.mul, xrange(1,n+1) or [1])


Generalización de la función boolean AND


# utilizando un iterable como argumento
g_and = lambda args: bool(args[0]) and (g_and(args[1:]) if args[1:] else True)

# utilizando los *args magic de python
gm_and = lambda *args: bool(args[0]) and (g_and(*args[1:]) if args[1:] else True)

>>> g_and([1,2,3])
True
>>> g_and([1,2,0])
False
>>> g_and([1,1,0,1])
False

>>> gm_and(True,True,True,False)
False
>>> gm_and(True,True,True,True)
True
>>> gm_and(False,False,False)
False

Listas por comprensión


>>> even = lambda n: n % 2
>>> evens = [n for n in range(10) if even(n)]

>>> words = ['Hello', 'Python', 'World']
>>> first_letter = [c[0] for c in words]


Otros demonios
Si bien son ejemplos muy básicos, y no intentan enseñar nada nuevo, la idea era mostrar que Python, es un lenguaje que no fue pensado para un paradigma determinado (como Smalltalk o Java), fue pensado como un lenguaje completo, fácil, simple, que una mucho de varios mundos, que se adhiera a la filosofia Unix, y sobretodo flexible.

No estoy diciendo tampoco, de que sea el lenguaje más adecuado para todo, simplemente, expreso mi satisfacción como programador al usar un lenguaje con todas estás características :).

1 comentario:

Anónimo dijo...
Este blog ha sido eliminado por un administrador de blog.