Funcional para trollear
-
Upload
alejandro-e-brito-monedero -
Category
Technology
-
view
1.187 -
download
3
Transcript of Funcional para trollear
![Page 1: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/1.jpg)
Funcional* para trollearPyconES 2015 - Valencia
Alejandro E Brito Monedero@ae_bm
![Page 2: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/2.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/3.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/4.jpg)
● 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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/5.jpg)
Alonzo Churh
Cálculo
![Page 6: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/6.jpg)
![Page 7: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/7.jpg)
Python no es un lenguaje funcional:● Mutabilidad por defecto● Iteración > recursividad● Tipos● ...
![Page 8: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/8.jpg)
● 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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/9.jpg)
Pensar en lineas de ensamblaje ocomando_1 | comando_2 | …si has usado un poco *NIX
![Page 10: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/10.jpg)
Hora de ver algo de python
![Page 11: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/11.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/12.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/13.jpg)
l = [pow(x, 2) for x in range(100) if x % 2 == 0]
for, if → list comprehension
![Page 14: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/14.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/15.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/16.jpg)
Hablemos de la memoria y el regalo del laziness
![Page 17: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/17.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/18.jpg)
![Page 19: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/19.jpg)
Mejor es iterar sobre cada elemento.Siendo el elemento creado justo antes de ser utilizado
![Page 20: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/20.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/21.jpg)
¿La única forma de crear iteradores es usar OOP e implementar la interfaz iterador?
![Page 22: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/22.jpg)
Generators
def fancy_generator(): yield "I" yield "am" yield "fancy"
' '.join(fancy_generator()) == 'I am fancy'
![Page 23: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/23.jpg)
La hora de las baterías ha llegado
![Page 24: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/24.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/25.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/26.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/27.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/28.jpg)
¿Los decoradores, los closures y funciones anidadas?
- Seguro ya hay N charlas del tema
![Page 29: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/29.jpg)
Hora de ver algo de código real
![Page 30: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/30.jpg)
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](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/31.jpg)
Preguntas
![Page 32: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/32.jpg)
Ya he terminado
![Page 33: Funcional para trollear](https://reader034.fdocumento.com/reader034/viewer/2022052117/5aade7387f8b9a3d6a8b4669/html5/thumbnails/33.jpg)
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