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

Funcional para trollear

Notas del editor

  • #2 Hablamos de que Valencia == Horchata
  • #3 No hablar de matemáticas, advertir que se puede ser ofensivo sin querer y las excusas que dan los medios
  • #4 Nombre, que hago, por si quieren insultar, y donde suelo estar por si quieren secuestrar
  • #5 Objetivos para hacer todo esto
  • #6 Hablamos que la programación funcional viene de las matemáticas, alonso church lambda calculo
  • #7 Relax
  • #8 Hablar que python no es un lenguaje funcional puro, no tunning recursion, mutable, asignacion, etc
  • #9 Pero no todo esta perdido si tomamos ideas como la inmutabilidad, los side effects, la composicion, funciones de primer orden, lazyness
  • #10 Mindset que adquieres usando unix, hablar de pipes, filters, tee, etc
  • #12 Traducion a map y filter del tipico for con un if
  • #13 Traducion a map y filter del tipico for con un if
  • #14 Traducion a map y filter del tipico for con un if
  • #15 Ejemplo de como usar zip, es muy chorra a este nivel
  • #16 Ejemplo de como usar zip, es muy chorra a este nivel
  • #17 Chiste en el que hablas de la memoria del ordenador, no precomputar todo y calcular cosas según se piden
  • #18 Fail
  • #25 Algebra de iteradores xD
  • #30 https://github.com/aebm/docker-image-cleaner/blob/master/di_cleaner.py https://github.com/aebm/shuffler/blob/master/shuffler.py https://github.com/aebm/tools/blob/master/es_janitor.py https://github.com/aebm/tools/blob/master/es_cleaner.py