Publicado el 6 de Mayo del 2018
10.801 visualizaciones desde el 6 de Mayo del 2018
593,9 KB
34 paginas
Creado hace 12a (01/05/2011)
Tema 1 Programación Funcional
Curso de Python Avanzado
Juan Pedro Bolívar Puente
Instituto de Astrofísica de Andalucía
Mayo de 2011
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
1 / 34
Índice
1 Repaso
2 Programación funcional
3 Funciones de primer orden
4 Funciones de alto orden
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
2 / 34
Índice
Repaso
1 Repaso
2 Programación funcional
3 Funciones de primer orden
4 Funciones de alto orden
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
3 / 34
Repaso
Repaso ...
Sintáxis básica
def funcion ( param , clave = " default " ):
print " E j e c u t a n d o : funcion ( " + \
str ( param ) + " , clave = " \
+ str ( clave ) + " ) "
return None
funcion (1)
funcion (1 , " mi clave " )
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
4 / 34
Funciones variádicas
Repaso
En la lista de parámetros ...
Operador * Captura en un nombre los parámetros
restantes como una tupla.
Operador ** Captura en un nombre las claves restantes
como un diccionario.
def funcion (* args , ** keys ):
print " -- Llamando a funcion con : -- "
print " P a r a m e t r o s : " , args
print " Claves : " , keys
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
5 / 34
Funciones variádicas
Repaso
En la lista de parámetros ...
Operador * Captura en un nombre los parámetros
restantes como una tupla.
Operador ** Captura en un nombre las claves restantes
como un diccionario.
funcion (1 , 2 , 3 , ’ manolete ’)
funcion ( nombre
= ’ Juan Pedro ’ ,
a pe ll i do s = ’ Bolivar Puente ’)
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
6 / 34
Funciones variádicas
Repaso
En una llamada a función
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
print sum3 (* range (3))
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
7 / 34
Funciones variádicas
Repaso
En una llamada a función
Operador * Expande una secuencia como argumentos a
la funcion.
Operador ** Expande un diccionario como argumentos
clave a la funcion.
def persona ( nombre = ’ Anonimo ’ ,
a pe ll i do s = ’ Bastardo ’ ,
dni = ’ Sin DNI ’ ):
print a pe ll i do s + " ," , nombre , " ( " + dni + " ) "
yo = { ’ nombre ’
: ’ Jhon ’ ,
’ a pe ll i do s ’ : ’ Doe ’ }
persona (** yo )
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
8 / 34
Programación funcional
Índice
1 Repaso
2 Programación funcional
3 Funciones de primer orden
4 Funciones de alto orden
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
9 / 34
Programación funcional
Programación Funcional
... érase una vez la conjetura de Hilbert ...
Modelo Máquina de Turing
Paradigma Imperativo ⇒
Estructurado ⇒ Orientado a
Objetos
Fortran, Algol, C, Smalltalk, Java
Modelo Lambda Calculi
Paradigma Funcional ⇒ Lógico ⇒
Declarativo
Lisp, ML, Prolog, Erlang, Haskell
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
10 / 34
Figura: Alonzo Church
Programación funcional
Programación multiparadigma
Python es
multiparadigma
Opinión personal ...
Macrodiseño ⇒ Orientación a Objetos
Microdiseño ⇒ Programación Funcional
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
11 / 34
Programación funcional
Programación imperativa
Unidad sintáctica elemental:
la sentencia
Operación elemental:
la asignación
Modelo: variables ...
“computar”
import random as r
x = 1
y = r . randint (0 ,10)
if y % 2:
x = x + 3
else :
x = x - 2
print x
Desventaja
Dificil razonar formalmente sobre el estado.
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
12 / 34
Programación funcional
Programación funcional
Unidad sintáctica elemental:la expresión
Operación elemental: la aplicación
Modelo: valores ... “calcular”
y = random . randint (0 , 10)
x = 1 + (3 if y % 2 else -2)
print x
Desventaja
Entrada y salida. Mutabilidad.
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
13 / 34
Funciones de primer orden
Índice
1 Repaso
2 Programación funcional
3 Funciones de primer orden
4 Funciones de alto orden
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
14 / 34
Funciones de primer orden
Funciones de primer orden
Programación funcional ⇒ Funciones valores “normales”
Genericidad Las funciones pueden
pasarse como parámetro.
Instanciación Las funciones pueden
devolver otras funciones.
Abstracción procedural Cualquier sentencia puede
convertirse en función.
Embebimiento Las funciones pueden
almacenerse en estructuras de datos.
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
15 / 34
Funciones de primer orden
Genericidad
Las funciones pueden pasarse como parámetro.
Ejemplo
def e j e c u t a r f u n ( funcion ):
res = funcion ()
print " R es u lt ad o : " + str ( res )
e j e c u t a r f u n ( random . random )
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
16 / 34
Funciones de primer orden
Instanciación
Las funciones pueden devolver otras funciones.
Ejemplo
def d e v u e l v e f u n ( param ):
if param : return random . random
else : return list
fun = d e v u e l v e f u n ( True )
print fun ()
fun = d e v u e l v e f u n ( False )
print fun ()
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
17 / 34
Funciones de primer orden
Abstracción procedural
Cualquier sentencia puede convertirse en función.
Ejemplo (Abstracción + Instanciación)
def m a k e _ s u m a d o r ( k ):
def sumador ( x ):
return x + k
return sumador
mas_dos = m a k e _ s u m a d o r (2)
print mas_dos (1) # Imprime 3
print mas_dos (2) # Imprime 4
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
18 / 34
Funciones de primer orden
Abstracción procedural ... Lambdas
Lambda = Función anónima (sin nombre).
¡Sólo 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
mas_dos = m a k e _ s u m a d o r _ l a m b d a (2)
print mas_dos (1)
print mas_dos (2)
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
19 / 34
Funciones de primer orden
Abstracción 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 contador ():
nonlocal x
x += 1
return contador
var = 2
cnt = m a k e _ c o n t a d o r ( var )
cnt (); cnt (); print var # 2!!
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
20 / 34
Funciones de primer orden
Abstracción procedural ... Lambdas
Ejemplo “correcto”
def m a k e _ c o n t a d o r ( x ):
def contador ():
x [0] += 1
return contador
var = [2]
cnt = m a k e _ c o n t a d o r ( var )
cnt (); cnt (); print var # [4] , Ok
Reflexión ...
¿Estado mutable + comportamiento? ⇒ ¡Objetos!
Alternativa Generadores (tema 3)
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
21 / 34
Funciones de primer orden
Embebimiento
Cualquier función puede guardarse en cualquier parte.
Ejemplo (Embebimiento)
from operator import add , sub , div # , mul
funcs = { ’+ ’
’ - ’
’* ’
’/ ’
: add ,
: sub ,
: lambda a , b : a * b ,
: div }
print funcs [ ’+ ’] (1 , 2)
print funcs [ ’ - ’] (1 , 2)
print funcs [ ’* ’] (1 , 2)
print funcs [ ’/ ’] (1 , 2)
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
22 / 34
Funciones de alto orden
Índice
1 Repaso
2 Programación funcional
3 Funciones de primer orden
4 Funciones de alto orden
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
23 / 34
Funciones de alto orden
Funciones de alto orden
Los tres mosqueteros de la programación funcional
Trabajar sobre listas ⇒ Abstraer la iteración
Filosofía
map (func, lista)
Devuelve una lista aplicando func a cada elemento
reduce (func, lista, (primero))
Devuelve un valor aplicando la operación binaria func
filter (pred, lista)
Devuelve una lista filtrando con el predicado pred
Juan Pedro Bolívar Puente (Instituto de Astrofísica de Andalucía)
Tema 1 Programación Funcional
Mayo de 2011
24 / 34
Funciones de alto orden
La función map (func, lista)
def map ( func , lista ):
res = []
for x in lista :
res . append ( func ( x ))
return res
def map ( func , lista ):
return [ func ( x ) for x in lista ]
print map ( lambda x : x * 2 , range (10))
Juan Pedro Bolívar Puente (Instituto de Astrofísica de
Comentarios de: Tema 1 Programación Funcional - Curso de Python Avanzado (1)