Funcional para trollear

  • Published on
    18-Mar-2018

  • View
    1.159

  • Download
    3

Transcript

Funcional* para trollearPyconES 2015 - ValenciaAlejandro E Brito Monedero@ae_bm AdvertenciaMe he ledo el CoC pero seguramente se me escape algo que pueda ser polticamente 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 protocoloNombre Alejandro Brito MonederoInsultos @ae_bmComo estoy aqu No se ^_^Ocupacin Sysadmin / DevOps / / BuzzwordParadero Madrid DevOps, Python Madrid, Postgres Espaa, ... Cdigo que cabe en tu memoria a corto plazo => Mantenible Capacidad de composicin Trollear no usando programacin imperativa Alonzo ChurhClculo Python no es un lenguaje funcional: Mutabilidad por defecto Iteracin > 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 ocomando_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 xxxxKilled process xxxx (python) Mejor es iterar sobre cada elemento.Siendo el elemento creado justo antes de ser utilizado Python 2range() 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? Generatorsdef fancy_generator(): yield "I" yield "am" yield "fancy"' '.join(fancy_generator()) == 'I am fancy' La hora de las bateras ha llegado itertoolsInspirados en construcciones de lenguajes tan populares como APL, Haskell y SMLEficientes en el uso de memoria (recordar los streams)https://docs.python.org/2/library/itertools.htmlhttps://docs.python.org/3/library/itertools.html itertoolscycle('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 6dropwhile(lambda x: x functoolsFunciones de orden superior a.k.a funciones que reciben y/o retornan funcionesDecoradoreshttps://docs.python.org/2/library/functools.htmlhttps://docs.python.org/3/library/functools.html functoolsreduce(operator.add, [1, 2, 3], -6) (((-6 + 1) + 2) + 3)partial(): generar una funcin con argumentos prefijados wraps(): para usar con los decoradoreslru_cache(): crear una funcin con memoria Los decoradores, los closures y funciones anidadas? - Seguro ya hay N charlas del tema Hora de ver algo de cdigo real ConclusionesHacer funciones pequeas K.I.S.SAprovechar las bateras de pythonPensar en listas, iteradores, streamsUsar composicin de funcionesEl I/O y las validaciones tratar de tenerlo en los extremosDisciplina para no introducir side effects Preguntas Ya he terminado Crditoshttps://upload.wikimedia.org/wikipedia/commons/8/87/Horchateria_de_Santa_Catalina_en_Valencia.jpghttps://upload.wikimedia.org/wikipedia/sr/7/73/Trollface.pnghttps://upload.wikimedia.org/wikipedia/commons/1/15/Ambox_warning_pn.svghttp://giphy.com/gifs/jon-stewart-why-lYKvaJ8EQTzCUhttps://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Lambda_lc.svg/500px-Lambda_lc.svg.pnghttp://witchkitteh.deviantart.com/art/Teach-me-204949930https://upload.wikimedia.org/wikipedia/en/a/a6/Alonzo_Church.jpghttp://giphy.com/gifs/a8749TBnyEIY8https://upload.wikimedia.org/wikipedia/commons/9/97/%22USE_PROPER_TOOLS_FOR_THE_JOB_-_TAKE_CARE_OF_THEM%22_-_NARA_-_515954.jpghttps://c2.staticflickr.com/8/7266/6953971910_664578fc08_b.jpghttp://i.giphy.com/NusWKgMXzVhIc.gifhttp://i.giphy.com/DJZ14OxhrEsx2.gifhttp://i.giphy.com/6lScd4x2D5Oko.gifhttp://i.giphy.com/l41lZZqhIUA6IJNDO.gifhttp://img4.wikia.nocookie.net/__cb20131226180633/dragonball/images/thumb/5/51/Grumpy-cat-nope.jpg/500px-Grumpy-cat-nope.jpghttp://i.giphy.com/AMqCTHuCMFpM4.gifhttp://i.giphy.com/IIjH0wN7F3uzS.gifhttp://i.giphy.com/fDzM81OYrNjJC.gif

Recommended

View more >