Python más funcional.
Gustavo Angulo
@woakas
2015-10-15
Diferenciación
- Python no es un lenguaje funcional
- Lisp, Scheme, Clojure.
Scala, Haskell, Erlang si lo són. - No es programación orientada a objetos
Elementos
-
Función es un objeto o clase (se puede pasar como parámetro a otras funciones).
-
Mucha recursión.
-
Muchas listas y diferentes formas de iterarlas.
-
Menos declaraciones más evaluación de expresiones
Compresión de listas
(List Comprehensions)
collection = []
for dt in data_set:
if condition(dt):
collection.append(dt)
else:
new = modify(dt)
collection.append(new)
collection = [d if condition(d) else modify(d)
for d in data_set]
Generadores
(Generators)
log_lines = (line for line in read_line(huge_log_file)
if complex_condition(line))
Compresión de diccionarios
(El nombre me lo inventé)
{i:chr(65+i) for i in range(6)}
Fibonacci
from functools import reduce
from operator import mul
def factorialHOF(n):
return reduce(mul, range(1, n+1), 1)
def factorial_recursive(N):
assert isinstance(N, int) and N >= 1
return 1 if N <= 1 else N * factorialR(N-1)
O(c^n)
O(log(n))
Adios a los ciclos
map(func, it)
for e in it:
func(e)
do_f = lambda f, *args: f(*args)
hola = lambda first, last: str("Hola %s %s" % (first, last))
adios = lambda first, last: str("Adios %s %s" % (first, last))
map(do_f, [hola, adios], ["Gustavo", "Pepe"], ["Angulo", "Perez"])
Closures
def make_add(a):
def adder(b):
return a+b
return adder
filter, map, reduce
map(lambda x: x*x, [i for i in range(10)])
filter(lambda x: x%2==0, [i for i in range(10)])
reduce(lambda x,y: x+y, [i for i in range(10)])
Donde ?
Gracias
@woakas
Python más funcional
By Gustavo Angulo
Python más funcional
- 951