Funcional para trollear

Preview:

Citation preview

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

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

Generadores combinatorios

...

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

Recommended