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
- Pattern matching
Python no es un lenguaje funcional en si, por ende, el Pattern matching nos los debe!
Pero, si bien no lo tiene, algunas personas, han tratado de "emular" esta feature: http://monkey.org/~marius/pattern-matching-in-python.html
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:
Publicar un comentario