Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python Funcional

Python Funcional

Introducción a las caracteristicas funcionales de python, y a fn.py.

Jesús Espino

November 08, 2014
Tweet

More Decks by Jesús Espino

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. Introducci´ on Python funcional fn.py Para terminar Python funcional Python

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

    Iteradores Generadores Jes´ us Espino Garc´ ıa Python funcional
  14. 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
  15. 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
  16. 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
  17. 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
  18. Introducci´ on Python funcional fn.py Para terminar Funciones de orden

    superior map filter sorted reduce decorators Jes´ us Espino Garc´ ıa Python funcional
  19. 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
  20. Introducci´ on Python funcional fn.py Para terminar Estructuras inmutables LinkedList

    Stack Queue Deque Vector SkewHeap PairingHeap Jes´ us Espino Garc´ ıa Python funcional
  21. 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 <fn.immutable.list.LinkedList object at 0x7f3927e59f08> >>> l.head >>> l.tail Jes´ us Espino Garc´ ıa Python funcional
  22. 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 <fn.immutable.list.Stack object at 0x7f3926ae9818> >>> (value, s3) = s2.pop() >>> value 10 Jes´ us Espino Garc´ ıa Python funcional
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. Introducci´ on Python funcional fn.py Para terminar Para terminar Para

    terminar Jes´ us Espino Garc´ ıa Python funcional
  29. 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
  30. 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
  31. Introducci´ on Python funcional fn.py Para terminar Dudas . .

    . Jes´ us Espino Garc´ ıa Python funcional