• No se han encontrado resultados

Tema 1 Programación Funcional

N/A
N/A
Protected

Academic year: 2021

Share "Tema 1 Programación Funcional"

Copied!
34
0
0

Texto completo

(1)

Tema 1

Programaci´

on Funcional

Curso de Python Avanzado

Juan Pedro Bol´ıvar Puente

Instituto de Astrof´ısica de Andaluc´ıa

(2)

´Indice

1

Repaso

2

Programaci´

on funcional

3

Funciones de primer orden

4

Funciones de alto orden

(3)

´Indice

1

Repaso

2

Programaci´

on funcional

3

Funciones de primer orden

(4)

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 " ):

print

" 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 " )

(5)

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 ):

print

" -- L l a m a n d o a f u n c i o n con : -- "

print

" P a r a m e t r o s : " , args

(6)

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 ’ )

(7)

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

(8)

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 ’ ):

print

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 )

(9)

´Indice

1

Repaso

2

Programaci´

on funcional

3

Funciones de primer orden

(10)

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

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 / 34

(11)

Programaci´

on multiparadigma

Python es

multiparadigma

Opini´

on personal ...

Macrodise˜

no

Orientaci´

on a Objetos

Microdise˜

no

Programaci´

on Funcional

(12)

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

print

x

Desventaja

Dificil

razonar formalmente

sobre el estado.

(13)

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)

print

x

Desventaja

(14)

Funciones de primer orden

´Indice

1

Repaso

2

Programaci´

on funcional

3

Funciones de primer orden

4

Funciones de alto orden

(15)

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

(16)

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 ()

print

" 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 )

(17)

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 )

print

fun ()

fun = d e v u e l v e f u n ( F a l s e )

(18)

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)

print

m a s _ d o s (1)

# Imprime 3

print

m a s _ d o s (2)

# Imprime 4

(19)

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)

print

m a s _ d o s (1)

print

m a s _ d o s (2)

(20)

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 ();

print

var

# 2!!

(21)

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 ();

print

var

# [4] , Ok

Reflexi´

on ...

¿Estado mutable + comportamiento?

¡Objetos!

Alternativa

Generadores (tema 3)

(22)

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 }

print

f u n c s [ ’ + ’ ] (1 , 2)

print

f u n c s [ ’ - ’ ] (1 , 2)

print

f u n c s [ ’ * ’ ] (1 , 2)

print

f u n c s [ ’ / ’ ] (1 , 2)

(23)

´Indice

1

Repaso

2

Programaci´

on funcional

3

Funciones de primer orden

(24)

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

(25)

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 ]

(26)

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

print

r e d u c e (

lambda

x , y : x + y , r a n g e ( 1 0 ) )

(27)
(28)

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 ) ]

print

f i l t e r (

lambda

x : x %2 == 0 , r a n g e ( 1 0 ) )

(29)

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 ]

(30)

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 )

print

print

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)

print

a d d t w o (3)

# 5

(31)

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

(32)

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

(33)

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

Google

http://goog-goopy.sourceforge.net/

(34)

Funciones de alto orden

¿Preguntas?

Muchas gracias por su atenci´

on.

Referencias

Documento similar

[r]

Se puede actuar sobre los tres tipos de factores de ruido que se consideran en la metodolog´ıa de Taguchi, es decir, factores de ruido externo, interno y unidad a unidad, en

(b) (1 punto) Determine cu´ antos expedientes hay que elegir como m´ınimo para que, con el mismo nivel de confianza y la misma proporci´ on muestral anteriores, el error que se

Instituto Universitario “Centro de Innovación en Química y Materiales Avanzados”

Hay un segundo requisito para que la expresión esté bien formada: los valores proporcionados como parámetros (que denominaremos parámetros reales) deben ser del mismo

Comunicación presentada en las V Jornadas Interdisciplinares: Estudios de Género en el Aula: Historia, Cultura visual e Historia del Arte, Málaga, España.. ¿Qué sería de

Documentación complementaria MAGNA

Las reglas de dise˜ no de la arquitectura von Neuman contin´ uan vigentes hoy en d´ıa para la construcci´ on de ordenadores: la unidad de control y la unidad aritm´etico-l´