Está en la página 1de 13

Funciones como parmetros, funciones como resultados

Introduccin a la Computacin Patricia Borensztejn Clase 26

Funciones de orden superior


Se llama as a la tcnica que permite pasar funciones como parmetros (C y Python lo permiten) y devolver funciones como resultado (C y Python lo permiten) Vamos a centrarnos en la sintaxis de Python, que es bastante mas sencilla que la de C, pues, en C, para usar estas funciones de orden superior, debemos primero crear punteros a funciones, y si ya son complicados los punteros a datos, imaginen ustedes los punteros a funciones.

Ejemplo
Explicacin:
La funcin saludar contiene:
3 funciones, un diccionario. Devuelve el valor de un diccionario que es una de las 3 funciones
def saludar(lang): def saludar_es(): print Hola def saludar_en(): print Hi def saludar_fr(): print Salut lang_func = ,es: saludar_es, en: saludar_en, fr: saludar_fr} return lang_func[lang]

Luego se puede invocar la funcin como siempre

f = saludar(es) f()

Las funciones son variables


Como vemos, las funciones son variables , y en python las variables son objetoslas funciones son objetos. Lo cual no es ninguna novedad ya que dijimos que TODO en Python es objeto. Una sintaxis alternativa no utiliza la variable auxiliar f. En este caso, el primer par de parntesis corresponde al parmetro de saludar, y el segundo al parmetro de la funcin devuelta por saludar.
f = saludar(es) f()

>>> saludar(en)() Hi >>> saludar(fr)() Salut

Map, Filter, Reduce


Son tres funciones donde podemos utilizar como parmetros las funciones de orden superior y que permiten sustituir los bucles tpicos de los lenguajes de programacin imperativos.

map(function, sequence[, sequence, ...])


Explicacin:
La funcin map aplica una funcin a cada elemento de una secuencia y devuelve una lista con el resultado de aplicar la funcin a cada elemento. Si se pasan como parmetros n secuencias, la funcin tendr que aceptar n argumentos. (??)

def cuadrado(n): return n ** 2 l = [1, 2, 3] l2 = map(cuadrado, l)

filter(function, sequence)
Explicacin:
La funcion filter verifica que los elementos de una secuencia cumplan una determinada condicin, devolviendo una secuencia con los elementos que cumplen esa condicin. Es decir, para cada elemento de sequence se aplica la funcin function; si el resultado es True se aade a la lista y en caso contrario se descarta.

def es_par(n): return (n % 2.0 == 0) l = [1, 2, 3] l2 = filter(es_par, l)

reduce(function, sequence[, initial])

Explicacin:
La funcin reduce aplica una funcin a pares de elementos de una secuencia hasta dejarla en un solo valor El ejemplo suma todos los elementos de una lista
def sumar(x, y): return x + y l = [1, 2, 3] l2 = reduce(sumar, l)

Funciones lambda
Existe un operador llamado lambda que sirve para crear funciones annimas, (on line) que no podrn ser utilizadas luego pues no tienen nombre. Las funciones lambda se construyen mediante el operador lambda, los parmetros de la funcin separados por comas (atencin, SIN parntesis), dos puntos (:) y el cdigo de la funcin.
def es_par(n): return (n % 2.0 == 0) l = [1, 2, 3] l2 = filter(es_par, l)

l = [1, 2, 3] l2 = filter(lambda n: n % 2.0 == 0, l)

Comprensin de listas
La comprensin de listas es una caracterstica tomada del lenguaje de programacin funcional Haskell que est presente en Python desde la versin 2.0 y consiste en una construccin que permite crear listas a partir de otras listas. Es una tcnica que va a reemplazar a las funciones map, filter y reduce a partir de Python 3.0 Cada una de estas construcciones consta de una expresin que determina cmo modificar el elemento de la lista original, seguida de una o varias clausulas for y opcionalmente una o varias clausulas if.

Comprensin de listas
def cuadrado(n): return n ** 2 l = [1, 2, 3] l2 = map(cuadrado, l) def es_par(n): return (n % 2.0 == 0) l = [1, 2, 3] l2 = filter(es_par, l) l = [0, 1, 2, 3] m = *a, b+ n = [] for s in m: for v in l: if v > 0: n.append(s* v)

l2 = [n ** 2 for n in l]

l2 = [n for n in l if n % 2.0 == 0] l = [0, 1, 2, 3] m = *a, b+ n = [s * v for s in m for v in l if v > 0]

Decoradores
Un decorador no es es mas que una funcin que recibe una funcin como parmetro y devuelve otra funcin como resultado. Por ejemplo podramos querer aadir la funcionalidad de que se imprimiera el nombre de la funcin llamada por motivos de depuracin
def mi_decorador(funcion): def nueva(*args): print Llamada a la funcion, funcion.__name__ retorno = funcion(*args) return retorno return nueva

Como vemos el cdigo de la funcin mi_decorador no hace ms que crear una nueva funcin y devolverla. Esta nueva funcin imprime el nombre de la funcin a la que decoramos, ejecuta el cdigo de dicha funcin, y devuelve su valor de retorno.

Decoradores
def mi_decorador(funcion): def nueva(*args): print Llamada a la funcion, funcion.__name__ retorno = funcion(*args) return retorno return nueva

>>> imp(hola) hola >>> mi_decorador(imp)(hola) Llamada a la funcin imp hola