Transcript
Page 1: Funcional para trollear

Funcional* para trollearPyconES 2015 - Valencia

Alejandro E Brito Monedero@ae_bm

Page 2: Funcional para trollear

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 ;-)

Page 3: Funcional para trollear

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, ...

Page 4: Funcional para trollear

● Código que cabe en tu memoria a corto plazo =>

● Mantenible● Capacidad de composición

● Trollear no usando programación imperativa

Page 5: Funcional para trollear

Alonzo Churh

Cálculo

Page 6: Funcional para trollear
Page 7: Funcional para trollear

Python no es un lenguaje funcional:● Mutabilidad por defecto● Iteración > recursividad● Tipos● ...

Page 8: Funcional para trollear

● 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

Page 9: Funcional para trollear

Pensar en lineas de ensamblaje ocomando_1 | comando_2 | …si has usado un poco *NIX

Page 10: Funcional para trollear

Hora de ver algo de python

Page 11: Funcional para trollear

l = []for e in range(100): if e % 2 == 0: l.append(pow(e, 2))

for, if → map y filter

Page 12: Funcional para trollear

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

Page 13: Funcional para trollear

l = [pow(x, 2) for x in range(100) if x % 2 == 0]

for, if → list comprehension

Page 14: Funcional para trollear

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

Page 15: Funcional para trollear

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

Page 16: Funcional para trollear

Hablemos de la memoria y el regalo del laziness

Page 17: Funcional para trollear

with open('genoma.txt', 'rb') as f: read_data = f.read() ...

Out of memory: kill process xxxxKilled process xxxx (python)

Page 18: Funcional para trollear
Page 19: Funcional para trollear

Mejor es iterar sobre cada elemento.Siendo el elemento creado justo antes de ser utilizado

Page 20: Funcional para trollear

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))

Page 21: Funcional para trollear

¿La única forma de crear iteradores es usar OOP e implementar la interfaz iterador?

Page 22: Funcional para trollear

Generators

def fancy_generator(): yield "I" yield "am" yield "fancy"

' '.join(fancy_generator()) == 'I am fancy'

Page 23: Funcional para trollear

La hora de las baterías ha llegado

Page 24: Funcional para trollear

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

Page 25: Funcional para trollear

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<5, [1,4,6,4,1]) → 6 4 1

takewhile(lambda x: x<5, [1,4,6,4,1]) → 1 4

Generadores combinatorios

...

Page 26: Funcional para trollear

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

Page 27: Funcional para trollear

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

Page 28: Funcional para trollear

¿Los decoradores, los closures y funciones anidadas?

- Seguro ya hay N charlas del tema

Page 29: Funcional para trollear

Hora de ver algo de código real

Page 30: Funcional para trollear

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

Page 31: Funcional para trollear

Preguntas

Page 32: Funcional para trollear

Ya he terminado

Page 33: Funcional para trollear

Créditoshttps://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


Top Related