PDF de programación - Python funcional

Python funcionalgráfica de visualizaciones

Publicado el 14 de Enero del 2017
1.276 visualizaciones desde el 14 de Enero del 2017
319,9 KB
33 paginas
Creado hace 8a (20/05/2015)
Introducción
Python funcional
fn.py
Para terminar

Python funcional

Jesús Espino García

8 de Noviembre de 2014

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Introducción

Introducción

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Que significa funcional?

Programación con funciones (matemáticas)

Funciones puras (mismas entradas, mismas salidas).

Inmutabilidad.

Ausencia de estado.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Por qué?

Paralelización.

Facilitar el testing.

Reusabilidad.

Depuración más fácil.

Estado muy controlado.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Típicas estrategias funcionales

Combinación y composición de funciones pequeñas.

Datos + funciones transformadoras.

Aplicación de transformaciones mediante orden superior.

Uso de funciones inline.

Acotado de efectos laterales.

Tendencia al uso de funciones puras.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Qué necesito?

Funciones como ciudadanos de primera (son un objeto más).

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Es python un lenguaje funcional?

No.

Es un lenguaje multi-paradigma.

Soporta algunas características funcionales.

Permite hacer programación funcional.

Carece de características avanzadas presentes en lenguajes funcionales.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Que me dan los lenguajes funcionales?

Estructuras inmutables eficientes.

Funciones de orden superior.

Pattern matching.

TCO: Tail call optimization.

Aplicación parcial y currificación.

Control de efectos laterales.

Funciones lambda.

Evaluación perezosa.

Composición de funciones.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Que me da python?

Evaluación perezosa (Limitada).

Aplicación parcial.

Funciones lambda.

Funciones de orden superior.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

¿Que me da fn.py?

Estructuras inmutables eficientes (En desarrollo).

TCO: Tail call optimization.

Aplicación parcial y currificación.

Composición de funciones.

Funciones lambda (Al estilo de Scala).

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funcional vs. Imperativo

Imperativo

x = sum(1, 2)
y = sum(x, 3)
z = prod(y, 4)
print(z)

Funcional
print(prod(sum(sum(1,2),3), 4))

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funcional vs. Imperativo

Funcional con composición y aplicación parcial

func = F(sum, 1, 2) >> F(sum, 3) >> F(prod, 4) >> print
func()

Funcional con currificación
prod4 = prod(4)
sum3 = sum(3)
sum2 = sum(2)
print(prod4(sum3(sum2(1))))

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Python funcional

Python funcional

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Evaluación perezosa

Iteradores

Generadores

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Evaluación perezosa

Iteradores
>>> i = map(print, [1,2,3])
>>> next(i)
1
>>> i = map(print, [1,2,3])
>>> list(i)
1
2
3
[None, None, None]

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Evaluación perezosa

x = 0
while True:
yield x
x += 1

Generadores
>>> import itertools
>>> def generate():
...
...
...
...
>>> numbers = generate()
>>> list(itertools.takewhile(lambda x: x < 10, numbers))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(itertools.takewhile(lambda x: x < 12, numbers))
[11]

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Aplicación parcial

Aplicación parcial
>>> from functools import partial
>>> from opertor import add
>>> add4 = partial(add, 4)
>>> add4(3)
7
>>> print_noline = partial(print, end="")
>>> print_noline("hello")
hello>>>

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funciones lambda

Funciones lambda
>>> pow2 = lambda x: x**2
>>> pow2(10)
100

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funciones de orden superior

map

filter

sorted

reduce

decorators

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funciones de orden superior

Funciones de orden superior

>>> list(map(lambda x: x**2, [1, 2, 3]))
[1, 4, 9]
>>> list(filter(lambda x: x > 1, [1, 2, 3]))
[2, 3]
>>> sorted([2, 1, 3], key=lambda x: x)
[1, 2, 3]
>>> sorted([1, 2, 3], key=lambda x: -x)
[3, 2, 1]
>>> from functools import reduce
>>> reduce(lambda x, y: x + y, [1, 2, 3])
6
>>> from functools import lru_cache
>>> cached_sum = lru_cache()(lambda x: sum(range(x)))
>>> cached_sum(4)
6

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

fn.py

fn.py

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Estructuras inmutables

LinkedList

Stack

Queue

Deque

Vector

SkewHeap

PairingHeap

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Estructuras inmutables

LinkedList
>>> from fn.immutable import LinkedList
>>> l = LinkedList()
>>> l.head
>>> l.tail
>>> l2 = l.cons(10)
>>> l2.head
10
>>> l2.tail
<fn.immutable.list.LinkedList object at 0x7f3927e59f08>
>>> l.head
>>> l.tail

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Estructuras inmutables

Stack
>>> from fn.immutable import Stack
>>> s = Stack()
>>> s.head
>>> s.tail
>>> s2 = s.push(10)
>>> s2.head
10
>>> s2.tail
<fn.immutable.list.Stack object at 0x7f3926ae9818>
>>> (value, s3) = s2.pop()
>>> value
10

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

TCO

Recursión normal
def fact(n):

if n == 0: return 1

return n * fact(n-1)

TCO
from fn import recur

@recur.tco
def fact(n, acc=1):

if n == 0: return False, acc
return True, (n-1, acc*n)

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Aplicación parcial

Aplicación parcial
>>> from fn import F
>>> from operator import add
>>> add2 = F(add, 2)
>>> add2(3)
5

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Currificación

Currificación
>>> from fn.func import curried
>>> curry_add = curried(lambda x, y: x + y)
>>> curry_add(2)(3)
5
>>> @curried
... def curried_add(x, y):
...
...
>>> curried_add(2)(3)
5

return x + y

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Composición de funciones

Composición normal

>>> myfunc = lambda x: duplicate(add2(x))
>>> myfunc(3)
10

Composición al estilo fn.py

>>> myfunc = F(duplicate) << add2
>>> myfunc(3)
10
>>> myfunc = F(add2) >> duplicate
>>> myfunc(3)
10

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Funciones lambda al estilo scala

Funciones lambda al estilo scala
>>> from fn import _
>>> (_ + _)(2, 3)
5
>>> list(map(_ + 2, [1, 2, 3]))
[3, 4, 5]

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Para terminar

Para terminar

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Conclusiones

Python permite programar de forma funcional.

Fn.py nos da las herramientas para llegar un poco más lejos.

Python + Fn.py se queda lejos de lenguajes como Erlang, Clojure o
Haskell.

Lo que se puede aplicar en Python es una mejora significativa sobre el
código.

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Referencias

https://github.com/kachayev/fn.py: Fn.py

https://docs.python.org/3/howto/functional.html: Howto de
programación funcional.

http://kachayev.github.io/talks/uapycon2012/: Charla de Alexey
Kachayev

Jesús Espino García

Python funcional

Introducción
Python funcional
fn.py
Para terminar

Dudas

. . .

Jesús Espino García

Python funcional
  • Links de descarga
http://lwp-l.com/pdf1753

Comentarios de: Python funcional (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad