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