Tema 1
Programaci´
on Funcional
Curso de Python Avanzado
Juan Pedro Bol´ıvar Puente
Instituto de Astrof´ısica de Andaluc´ıa
´Indice
1
Repaso
2
Programaci´
on funcional
3
Funciones de primer orden
4
Funciones de alto orden
´Indice
1
Repaso
2
Programaci´
on funcional
3
Funciones de primer orden
Repaso
Repaso ...
Sint´
axis b´
asica
def
f u n c i o n ( param , c l a v e = " d e f a u l t " ):
" E j e c u t a n d o : f u n c i o n ( " + \
str ( p a r a m ) + " , c l a v e = " \
+ str ( c l a v e ) + " ) "
return
None
f u n c i o n (1)
f u n c i o n (1 , " mi c l a v e " )
Funciones vari´
adicas
En la lista de par´
ametros ...
Operador
*
Captura en un nombre los par´
ametros
restantes como una
tupla.
Operador
**
Captura en un nombre las claves restantes
como un
diccionario.
def
f u n c i o n (* args , ** keys ):
" -- L l a m a n d o a f u n c i o n con : -- "
" P a r a m e t r o s : " , args
Repaso
Funciones vari´
adicas
En la lista de par´
ametros ...
Operador
*
Captura en un nombre los par´
ametros
restantes como una
tupla.
Operador
**
Captura en un nombre las claves restantes
como un
diccionario.
f u n c i o n (1 , 2 , 3 , ’ m a n o l e t e ’ )
f u n c i o n ( n o m b r e
= ’ Juan P e d r o ’ ,
a p e l l i d o s = ’ B o l i v a r P u e n t e ’ )
Funciones vari´
adicas
En una llamada a funci´
on
Operador
*
Expande una secuencia como argumentos a
la funcion.
Operador
**
Expande un diccionario como argumentos
clave a la funcion.
def
sum3 ( a , b , c ):
return
a + b + c
Repaso
Funciones vari´
adicas
En una llamada a funci´
on
Operador
*
Expande una secuencia como argumentos a
la funcion.
Operador
**
Expande un diccionario como argumentos
clave a la funcion.
def
p e r s o n a ( n o m b r e = ’ A n o n i m o ’ ,
a p e l l i d o s = ’ B a s t a r d o ’ ,
dni = ’ Sin DNI ’ ):
a p e l l i d o s + " , " , nombre , " ( " + dni + " ) "
yo = { ’ n o m b r e ’
: ’ Jhon ’ ,
’ a p e l l i d o s ’ : ’ Doe ’ }
p e r s o n a (** yo )
´Indice
1
Repaso
2
Programaci´
on funcional
3
Funciones de primer orden
Programaci´on funcional
Programaci´
on Funcional
... ´
erase una vez la conjetura de Hilbert ...
Modelo M´
aquina de Turing
Paradigma
Imperativo
⇒
Estructurado
⇒
Orientado a
Objetos
Fortran, Algol, C, Smalltalk, Java
Modelo Lambda Calculi
Paradigma
Funcional
⇒
L´
ogico
⇒
Declarativo
Lisp, ML, Prolog, Erlang, Haskell
Figura:
Alonzo Church
Juan Pedro Bol´ıvar Puente (Instituto de Astrof´ısica de Andaluc´ıa)Tema 1Programaci´on Funcional Mayo de 2011 10 / 34Programaci´
on multiparadigma
Python es
multiparadigma
Opini´
on personal ...
Macrodise˜
no
⇒
Orientaci´
on a Objetos
Microdise˜
no
⇒
Programaci´
on Funcional
Programaci´on funcional
Programaci´
on imperativa
Unidad sint´
actica elemental:
la sentencia
Operaci´
on elemental:
la asignaci´
on
Modelo:
variables
...
“computar”
import
r a n d o m as r
x = 1
y = r . r a n d i n t (0 ,10)
if
y
% 2:
x = x + 3
else
:
x = x - 2
x
Desventaja
Dificil
razonar formalmente
sobre el estado.
Programaci´
on funcional
Unidad sint´
actica elemental:la expresi´
on
Operaci´
on elemental:
la aplicaci´
on
Modelo:
valores
... “calcular”
y = r a n d o m . r a n d i n t (0 , 10)
x = 1 + (3
if
y
% 2
else
-2)
x
Desventaja
Funciones de primer orden
´Indice
1
Repaso
2
Programaci´
on funcional
3
Funciones de primer orden
4
Funciones de alto orden
Funciones de primer orden
Programaci´
on funcional
⇒
Funciones valores “normales”
Genericidad
Las funciones pueden
pasarse como par´
ametro
.
Instanciaci´
on
Las funciones pueden
devolver otras funciones
.
Abstracci´
on procedural
Cualquier sentencia puede
convertirse en funci´
on
.
Embebimiento
Las funciones pueden
Funciones de primer orden
Genericidad
Las funciones pueden
pasarse como par´
ametro
.
Ejemplo
def
e j e c u t a r f u n ( f u n c i o n ):
res = f u n c i o n ()
" R e s u l t a d o : " + str ( res )
e j e c u t a r f u n ( r a n d o m . r a n d o m )
Instanciaci´
on
Las funciones pueden
devolver otras funciones
.
Ejemplo
def
d e v u e l v e f u n ( p a r a m ):
if
p a r a m :
return
r a n d o m . r a n d o m
else
:
return
list
fun = d e v u e l v e f u n ( True )
fun ()
fun = d e v u e l v e f u n ( F a l s e )
Funciones de primer orden
Abstracci´
on procedural
Cualquier sentencia puede
convertirse en funci´
on
.
Ejemplo (Abstracci´
on + Instanciaci´
on)
def
m a k e _ s u m a d o r ( k ):
def
s u m a d o r ( x ):
return
x + k
return
s u m a d o r
m a s _ d o s = m a k e _ s u m a d o r (2)
m a s _ d o s (1)
# Imprime 3
m a s _ d o s (2)
# Imprime 4
Abstracci´
on procedural ... Lambdas
Lambda
= Funci´
on an´
onima (sin nombre).
¡S´
olo expresiones!
Ejemplo (Lambdas...)
def
m a k e _ s u m a d o r _ l a m b d a ( k ):
return lambda
x : x + k
m a s _ d o s = m a k e _ s u m a d o r _ l a m b d a (2)
m a s _ d o s (1)
m a s _ d o s (2)
Funciones de primer orden
Abstracci´
on procedural ... Lambdas
El
cierre
captura
valores
no nombres
I.e. no podemos modificar la variable “de fuera”
Ejemplo incorrecto (... y requiere Python 3)
def
m a k e _ c o n t a d o r ( x ):
def
c o n t a d o r ():
n o n l o c a l x
x += 1
return
c o n t a d o r
var = 2
cnt = m a k e _ c o n t a d o r ( var )
cnt (); cnt ();
var
# 2!!
Abstracci´
on procedural ... Lambdas
Ejemplo “correcto”
def
m a k e _ c o n t a d o r ( x ):
def
c o n t a d o r ():
x [0] += 1
return
c o n t a d o r
var = [2]
cnt = m a k e _ c o n t a d o r ( var )
cnt (); cnt ();
var
# [4] , Ok
Reflexi´
on ...
¿Estado mutable + comportamiento?
⇒
¡Objetos!
Alternativa
Generadores (tema 3)
Funciones de primer orden
Embebimiento
Cualquier funci´
on puede
guardarse en cualquier parte
.
Ejemplo (Embebimiento)
from
o p e r a t o r
import
add , sub , div
# , mul
f u n c s = { ’ + ’
: add ,
’ - ’
: sub ,
’ * ’
:
lambda
a , b : a * b ,
’ / ’
: div }
f u n c s [ ’ + ’ ] (1 , 2)
f u n c s [ ’ - ’ ] (1 , 2)
f u n c s [ ’ * ’ ] (1 , 2)
f u n c s [ ’ / ’ ] (1 , 2)
´Indice
1
Repaso
2
Programaci´
on funcional
3
Funciones de primer orden
Funciones de alto orden
Funciones de alto orden
Los tres mosqueteros de la programaci´
on funcional
Filosof´ıa
Trabajar sobre
listas
⇒
Abstraer
la iteraci´
on
map (func, lista)
Devuelve una lista aplicando
func
a cada elemento
reduce (func, lista, (primero))
Devuelve un valor aplicando la operaci´
on binaria
func
filter (pred, lista)
Devuelve una lista filtrando con el predicado
pred
La funci´
on
map (func, lista)
def
map ( func , l i s t a ):
res = []
for
x
in
l i s t a :
res . a p p e n d ( func ( x ))
return
res
def
map ( func , l i s t a ):
return
[ func ( x )
for
x
in
l i s t a ]
Funciones de alto orden
La funci´
on
reduce (func, lista)
def
r e d u c e ( func , lista , inic = None ):
if
inic
is
None :
inic , l i s t a = l i s t a [0] , l i s t a [1:]
for
x
in
l i s t a :
inic = func ( inic , x )
return
inic
r e d u c e (
lambda
x , y : x + y , r a n g e ( 1 0 ) )
Funciones de alto orden
La funci´
on
filter (pred, lista)
def
f i l t e r ( pred , l i s t a ):
res = []
for
x
in
l i s t a :
if
pred ( x ):
res . a p p e n d ( x )
return
res
def
f i l t e r ( pred , l i s t a ):
return
[ x
for
x
in
l i s t a
\
if
pred ( x ) ]
f i l t e r (
lambda
x : x %2 == 0 , r a n g e ( 1 0 ) )
map + filter
vs comprehensi´
on
¡No hay que fliparse!
map (
lambda
x : x *2 , f i l t e r (
lambda
x : x %2==0 , r a n g e ( 1 0 ) ) )
Mejor...
[ x *2
for
x
in
r a n g e (10)
if
x %2==0 ]
Funciones de alto orden
Currificaci´
on
Currificaci´
on
= Fijar par´
ametros de una funci´
on.
A mano
from
o p e r a t o r
import
add
a d d t w o =
lambda
x : add (2 , x )
a d d t w o (3)
# 5
Con
functools.partial
from
f u n c t o o l s
import
p a r t i a l
a d d t w o = p a r t i a l ( add , 2)
a d d t w o (3)
# 5
Otras utilidades
Emparejar los elementos de dos listas ...
zip ( ’ hola ’ , r a n g e (3))
Verdadero si todos son verdaderos ...
all ([ True , [] , True ])
Verdadero si alguno es verdadero ...
Funciones de alto orden
Recursos adicionales
Dive Into Python
Mark Pilgrim
http://diveintopython.org/functional_
programming/index.html
Functional Programming HOWTO
Andrew M. Kuchling
http:
//www.amk.ca/python/writing/functional
Recursos adicionales
Concepts, Techniques, and Models of Computer
Programming
Peter Van Roy, Seif Haridi
MIT Press 2005
python-functional
Collin Winter
http://oakwinter.com/code/functional/
documentation/
python-goopy
http://goog-goopy.sourceforge.net/
Funciones de alto orden