Funcional para trollear

  • Published on
    18-Mar-2018

  • View
    1.096

  • Download
    2

DESCRIPTION

Funcional* para trollear PyconES 2015 - Valencia Alejandro E Brito Monedero @ae_bm Advertencia Me he leído el CoC pero seguramente se me escape algo que pueda ser políticamente…

Transcript

Funcional* para trollear PyconES 2015 - Valencia Alejandro E Brito Monedero @ae_bm Advertencia Me he leído el CoC pero seguramente se me escape algo que pueda ser políticamente incorrecto. En mi defensa, el Gangsta Rap, los videojuegos, el metal y el stand up comedy de genios como Richard Pryor y George Carlin. Sobre la monadas, functores y otros temas fancy, esta no es la charla ni la conferencia JFYI ;-) El protocolo Nombre Alejandro Brito Monedero Insultos @ae_bm Como estoy aquí No se ^_^ Ocupación Sysadmin / DevOps / … / Buzzword Paradero Madrid DevOps, Python Madrid, Postgres España, ... ● Código que cabe en tu memoria a corto plazo => ● Mantenible ● Capacidad de composición ● Trollear no usando programación imperativa Alonzo Churh Cálculo Python no es un lenguaje funcional: ● Mutabilidad por defecto ● Iteración > recursividad ● Tipos ● ... ● Reducir los side effects ● Reducir la necesidad de mutar los datos ● Funciones como ciudadanos de primer orden ● Hacer funciones que se puedan componer ● Aprovechar el lazyness Pensar en lineas de ensamblaje o comando_1 | comando_2 | … si has usado un poco *NIX Hora de ver algo de python l = [] for e in range(100): if e % 2 == 0: l.append(pow(e, 2)) for, if → map y filter l = map(lambda x: pow(x, 2), filter(lambda x: x % 2 == 0, range(100))) for, if → map y filter * en python 3 l no es una lista l = [pow(x, 2) for x in range(100) if x % 2 == 0] for, if → list comprehension a = [0, 2, 4, 6] b = [1, 3, 5] c = [] while a and b: c.append((a.pop(0), b.pop(0))) c == [(0, 1), (2, 3), (4, 5)] zip a.k.a cremallera a = [0, 2, 4, 6] b = [1, 3, 5] c = zip(a, b) c == [(0, 1), (2, 3), (4, 5)] zip a.k.a cremallera Hablemos de la memoria y el regalo del laziness with open('genoma.txt', 'rb') as f: read_data = f.read() ... Out of memory: kill process xxxx Killed process xxxx (python) Mejor es iterar sobre cada elemento. Siendo el elemento creado justo antes de ser utilizado Python 2 range() → xrange() map() → itertools.imap() filter() → itertools.ifilter() zip() → itertools.izip() Python 2 y Python 3 [x for x in iterable if f(x)] → (x for x in interable if f(x)) ¿La única forma de crear iteradores es usar OOP e implementar la interfaz iterador? Generators def fancy_generator(): yield "I" yield "am" yield "fancy" ' '.join(fancy_generator()) == 'I am fancy' La hora de las baterías ha llegado itertools Inspirados en construcciones de lenguajes tan populares como APL, Haskell y SML Eficientes en el uso de memoria (recordar los streams) https://docs.python.org/2/library/itertools.html https://docs.python.org/3/library/itertools.html itertools cycle('abc') → 'a' 'b' 'c' 'a' 'b' 'c' 'a' ... repeat('¿cuanto falta?') → '¿cuanto falta?' '¿cuando falta?' ... chain([1,2,3], [4, 5, 6]) → 1 2 3 4 5 6 dropwhile(lambda x: x functools Funciones de orden superior a.k.a funciones que reciben y/o retornan funciones Decoradores https://docs.python.org/2/library/functools.html https://docs.python.org/3/library/functools.html functools reduce(operator.add, [1, 2, 3], -6) → (((-6 + 1) + 2) + 3) partial(): generar una función con argumentos prefijados wraps(): para usar con los decoradores lru_cache(): crear una función con memoria ¿Los decoradores, los closures y funciones anidadas? - Seguro ya hay N charlas del tema Hora de ver algo de código real Conclusiones Hacer funciones pequeñas K.I.S.S Aprovechar las baterías de python Pensar en listas, iteradores, streams Usar composición de funciones El I/O y las validaciones tratar de tenerlo en los extremos Disciplina para no introducir side effects Preguntas Ya he terminado Créditos https://upload.wikimedia.org/wikipedia/commons/8/87/Horchateria_de_Santa_Catalina_en_Valencia.jpg https://upload.wikimedia.org/wikipedia/sr/7/73/Trollface.png https://upload.wikimedia.org/wikipedia/commons/1/15/Ambox_warning_pn.svg http://giphy.com/gifs/jon-stewart-why-lYKvaJ8EQTzCU https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Lambda_lc.svg/500px-Lambda_lc.svg.png http://witchkitteh.deviantart.com/art/Teach-me-204949930 https://upload.wikimedia.org/wikipedia/en/a/a6/Alonzo_Church.jpg http://giphy.com/gifs/a8749TBnyEIY8 https://upload.wikimedia.org/wikipedia/commons/9/97/%22USE_PROPER_TOOLS_FOR_THE_JOB_- _TAKE_CARE_OF_THEM%22_-_NARA_-_515954.jpg https://c2.staticflickr.com/8/7266/6953971910_664578fc08_b.jpg http://i.giphy.com/NusWKgMXzVhIc.gif http://i.giphy.com/DJZ14OxhrEsx2.gif http://i.giphy.com/6lScd4x2D5Oko.gif http://i.giphy.com/l41lZZqhIUA6IJNDO.gif http://img4.wikia.nocookie.net/__cb20131226180633/dragonball/images/thumb/5/51/Grumpy-cat- nope.jpg/500px-Grumpy-cat-nope.jpg http://i.giphy.com/AMqCTHuCMFpM4.gif http://i.giphy.com/IIjH0wN7F3uzS.gif http://i.giphy.com/fDzM81OYrNjJC.gif