Slide 1

Slide 1 text

Introducci´ on Python funcional fn.py Para terminar Python funcional Jes´ us Espino Garc´ ıa 8 de Noviembre de 2014 Jes´ us Espino Garc´ ıa Python funcional

Slide 2

Slide 2 text

Introducci´ on Python funcional fn.py Para terminar Introducci´ on Introducci´ on Jes´ us Espino Garc´ ıa Python funcional

Slide 3

Slide 3 text

Introducci´ on Python funcional fn.py Para terminar ¿Que significa funcional? Programaci´ on con funciones (matem´ aticas) Funciones puras (mismas entradas, mismas salidas). Inmutabilidad. Ausencia de estado. Jes´ us Espino Garc´ ıa Python funcional

Slide 4

Slide 4 text

Introducci´ on Python funcional fn.py Para terminar ¿Por qu´ e? Paralelizaci´ on. Facilitar el testing. Reusabilidad. Depuraci´ on m´ as f´ acil. Estado muy controlado. Jes´ us Espino Garc´ ıa Python funcional

Slide 5

Slide 5 text

Introducci´ on Python funcional fn.py Para terminar T´ ıpicas estrategias funcionales Combinaci´ on y composici´ on de funciones peque˜ nas. Datos + funciones transformadoras. Aplicaci´ on de transformaciones mediante orden superior. Uso de funciones inline. Acotado de efectos laterales. Tendencia al uso de funciones puras. Jes´ us Espino Garc´ ıa Python funcional

Slide 6

Slide 6 text

Introducci´ on Python funcional fn.py Para terminar ¿Qu´ e necesito? Funciones como ciudadanos de primera (son un objeto m´ as). Jes´ us Espino Garc´ ıa Python funcional

Slide 7

Slide 7 text

Introducci´ on Python funcional fn.py Para terminar ¿Es python un lenguaje funcional? No. Es un lenguaje multi-paradigma. Soporta algunas caracter´ ısticas funcionales. Permite hacer programaci´ on funcional. Carece de caracter´ ısticas avanzadas presentes en lenguajes funcionales. Jes´ us Espino Garc´ ıa Python funcional

Slide 8

Slide 8 text

Introducci´ on Python funcional fn.py Para terminar ¿Que me dan los lenguajes funcionales? Estructuras inmutables eficientes. Funciones de orden superior. Pattern matching. TCO: Tail call optimization. Aplicaci´ on parcial y currificaci´ on. Control de efectos laterales. Funciones lambda. Evaluaci´ on perezosa. Composici´ on de funciones. Jes´ us Espino Garc´ ıa Python funcional

Slide 9

Slide 9 text

Introducci´ on Python funcional fn.py Para terminar ¿Que me da python? Evaluaci´ on perezosa (Limitada). Aplicaci´ on parcial. Funciones lambda. Funciones de orden superior. Jes´ us Espino Garc´ ıa Python funcional

Slide 10

Slide 10 text

Introducci´ on Python funcional fn.py Para terminar ¿Que me da fn.py? Estructuras inmutables eficientes (En desarrollo). TCO: Tail call optimization. Aplicaci´ on parcial y currificaci´ on. Composici´ on de funciones. Funciones lambda (Al estilo de Scala). Jes´ us Espino Garc´ ıa Python funcional

Slide 11

Slide 11 text

Introducci´ on Python funcional fn.py Para terminar Funcional vs. Imperativo Imperativo x = sum(1, 2) y = sum(x, 3) z = prod(y, 4) print(z) Funcional print(prod(sum(sum(1,2),3), 4)) Jes´ us Espino Garc´ ıa Python funcional

Slide 12

Slide 12 text

Introducci´ on Python funcional fn.py Para terminar Funcional vs. Imperativo Funcional con composici´ on y aplicaci´ on parcial func = F(sum, 1, 2) >> F(sum, 3) >> F(prod, 4) >> print func() Funcional con currificaci´ on prod4 = prod(4) sum3 = sum(3) sum2 = sum(2) print(prod4(sum3(sum2(1)))) Jes´ us Espino Garc´ ıa Python funcional

Slide 13

Slide 13 text

Introducci´ on Python funcional fn.py Para terminar Python funcional Python funcional Jes´ us Espino Garc´ ıa Python funcional

Slide 14

Slide 14 text

Introducci´ on Python funcional fn.py Para terminar Evaluaci´ on perezosa Iteradores Generadores Jes´ us Espino Garc´ ıa Python funcional

Slide 15

Slide 15 text

Introducci´ on Python funcional fn.py Para terminar Evaluaci´ on perezosa Iteradores >>> i = map(print, [1,2,3]) >>> next(i) 1 >>> i = map(print, [1,2,3]) >>> list(i) 1 2 3 [None, None, None] Jes´ us Espino Garc´ ıa Python funcional

Slide 16

Slide 16 text

Introducci´ on Python funcional fn.py Para terminar Evaluaci´ on perezosa Generadores >>> import itertools >>> def generate(): ... x = 0 ... while True: ... yield x ... x += 1 >>> numbers = generate() >>> list(itertools.takewhile(lambda x: x < 10, numbers)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(itertools.takewhile(lambda x: x < 12, numbers)) [11] Jes´ us Espino Garc´ ıa Python funcional

Slide 17

Slide 17 text

Introducci´ on Python funcional fn.py Para terminar Aplicaci´ on parcial Aplicaci´ on parcial >>> from functools import partial >>> from opertor import add >>> add4 = partial(add, 4) >>> add4(3) 7 >>> print_noline = partial(print, end="") >>> print_noline("hello") hello>>> Jes´ us Espino Garc´ ıa Python funcional

Slide 18

Slide 18 text

Introducci´ on Python funcional fn.py Para terminar Funciones lambda Funciones lambda >>> pow2 = lambda x: x**2 >>> pow2(10) 100 Jes´ us Espino Garc´ ıa Python funcional

Slide 19

Slide 19 text

Introducci´ on Python funcional fn.py Para terminar Funciones de orden superior map filter sorted reduce decorators Jes´ us Espino Garc´ ıa Python funcional

Slide 20

Slide 20 text

Introducci´ on Python funcional fn.py Para terminar Funciones de orden superior Funciones de orden superior >>> list(map(lambda x: x**2, [1, 2, 3])) [1, 4, 9] >>> list(filter(lambda x: x > 1, [1, 2, 3])) [2, 3] >>> sorted([2, 1, 3], key=lambda x: x) [1, 2, 3] >>> sorted([1, 2, 3], key=lambda x: -x) [3, 2, 1] >>> from functools import reduce >>> reduce(lambda x, y: x + y, [1, 2, 3]) 6 >>> from functools import lru_cache >>> cached_sum = lru_cache()(lambda x: sum(range(x))) >>> cached_sum(4) 6 Jes´ us Espino Garc´ ıa Python funcional

Slide 21

Slide 21 text

Introducci´ on Python funcional fn.py Para terminar fn.py fn.py Jes´ us Espino Garc´ ıa Python funcional

Slide 22

Slide 22 text

Introducci´ on Python funcional fn.py Para terminar Estructuras inmutables LinkedList Stack Queue Deque Vector SkewHeap PairingHeap Jes´ us Espino Garc´ ıa Python funcional

Slide 23

Slide 23 text

Introducci´ on Python funcional fn.py Para terminar Estructuras inmutables LinkedList >>> from fn.immutable import LinkedList >>> l = LinkedList() >>> l.head >>> l.tail >>> l2 = l.cons(10) >>> l2.head 10 >>> l2.tail >>> l.head >>> l.tail Jes´ us Espino Garc´ ıa Python funcional

Slide 24

Slide 24 text

Introducci´ on Python funcional fn.py Para terminar Estructuras inmutables Stack >>> from fn.immutable import Stack >>> s = Stack() >>> s.head >>> s.tail >>> s2 = s.push(10) >>> s2.head 10 >>> s2.tail >>> (value, s3) = s2.pop() >>> value 10 Jes´ us Espino Garc´ ıa Python funcional

Slide 25

Slide 25 text

Introducci´ on Python funcional fn.py Para terminar TCO Recursi´ on normal def fact(n): if n == 0: return 1 return n * fact(n-1) TCO from fn import recur @recur.tco def fact(n, acc=1): if n == 0: return False, acc return True, (n-1, acc*n) Jes´ us Espino Garc´ ıa Python funcional

Slide 26

Slide 26 text

Introducci´ on Python funcional fn.py Para terminar Aplicaci´ on parcial Aplicaci´ on parcial >>> from fn import F >>> from operator import add >>> add2 = F(add, 2) >>> add2(3) 5 Jes´ us Espino Garc´ ıa Python funcional

Slide 27

Slide 27 text

Introducci´ on Python funcional fn.py Para terminar Currificaci´ on Currificaci´ on >>> from fn.func import curried >>> curry_add = curried(lambda x, y: x + y) >>> curry_add(2)(3) 5 >>> @curried ... def curried_add(x, y): ... return x + y ... >>> curried_add(2)(3) 5 Jes´ us Espino Garc´ ıa Python funcional

Slide 28

Slide 28 text

Introducci´ on Python funcional fn.py Para terminar Composici´ on de funciones Composici´ on normal >>> myfunc = lambda x: duplicate(add2(x)) >>> myfunc(3) 10 Composici´ on al estilo fn.py >>> myfunc = F(duplicate) << add2 >>> myfunc(3) 10 >>> myfunc = F(add2) >> duplicate >>> myfunc(3) 10 Jes´ us Espino Garc´ ıa Python funcional

Slide 29

Slide 29 text

Introducci´ on Python funcional fn.py Para terminar Funciones lambda al estilo scala Funciones lambda al estilo scala >>> from fn import _ >>> (_ + _)(2, 3) 5 >>> list(map(_ + 2, [1, 2, 3])) [3, 4, 5] Jes´ us Espino Garc´ ıa Python funcional

Slide 30

Slide 30 text

Introducci´ on Python funcional fn.py Para terminar Para terminar Para terminar Jes´ us Espino Garc´ ıa Python funcional

Slide 31

Slide 31 text

Introducci´ on Python funcional fn.py Para terminar Conclusiones Python permite programar de forma funcional. Fn.py nos da las herramientas para llegar un poco m´ as lejos. Python + Fn.py se queda lejos de lenguajes como Erlang, Clojure o Haskell. Lo que se puede aplicar en Python es una mejora significativa sobre el c´ odigo. Jes´ us Espino Garc´ ıa Python funcional

Slide 32

Slide 32 text

Introducci´ on Python funcional fn.py Para terminar Referencias https://github.com/kachayev/fn.py: Fn.py https://docs.python.org/3/howto/functional.html: Howto de programaci´ on funcional. http://kachayev.github.io/talks/uapycon2012/: Charla de Alexey Kachayev Jes´ us Espino Garc´ ıa Python funcional

Slide 33

Slide 33 text

Introducci´ on Python funcional fn.py Para terminar Dudas . . . Jes´ us Espino Garc´ ıa Python funcional