Profesor Miguel Cantillana
INS240 – Lenguajes de Programación
Ingeniería en Computación e Informática
Semestre 2017-1
Paradigma funcional con Python
// Funcion Pura
function doble(num) {
return num * 2; // No modifica el argumento.
}
function doblarLista(listado){
// Retorna un nuevo listado sin modificar nada.
return listado.map(doble);
}
// Funcion Impura
function doblarLista(listado){
for( var i =0; i < listado.items; i++ ){
// Cambiamos los valores entregados como argumentos
listado[i] = doble(listado[i]);
}
}
Macrodiseño ⇒ Orientación a Objetos
Microdiseño ⇒ Programación Funcional
import random as r
x = 1
y = r . randint (0 ,10)
if y % 2:
x = x + 3
else :
x = x - 2
print x
y = random . randint (0 , 10)
x = 1 + (3 if y % 2 else -2)
print x
Son funciones que reciben o devuelven funciones como parámetros.
Operan sobre funciones, es decir el dominio o la imagen de estas funciones son funciones.
Las funciones pueden pasarse como parámetro.
def ejecutarfun ( funcion ):
res = funcion ()
print " Resultado : " + str ( res )
ejecutarfun (random.random)
Las funciones pueden pasarse como parámetro.
def superior(interna):
def funcion1():
print "Funcion1"
def funcion2():
print "Funcion2"
funcion = {
'uno' : funcion1,
'dos' : funcion2
}
return funcion[interna]
nueva_funcion = superior('dos')
nueva_funcion()
Las funciones pueden pasarse como parámetro.
def funcion1():
print "Funcion1"
def funcion2():
print "Funcion2"
def superior(funcion):
funcion()
superior(funcion1)
superior(funcion2)
Las funciones pueden devolver otras funciones.
def devuelvefun ( param ):
if param : return random.random
else : return list
fun = devuelvefun ( True )
print fun ()
fun = devuelvefun ( False )
print fun ()
Cualquier sentencia puede convertirse en función.
def make_sumador ( k ):
def sumador ( x ):
return x + k
return sumador
mas_dos = make_sumador (2)
print mas_dos (1) # Imprime 3
print mas_dos (2) # Imprime 4
# Ejemplo (Abstracción + Instanciación)
lambda <parámetros>:<expresión></expresión></parámetros>
Son funciones anónimas, mínimas definidas en una línea, no pueden contener bucles y no pueden utilizar la palabra clave return para regresar un valor.
cuadrado = lambda x: x ** 2
print cuadrado(2)
lista = range(10)
for numero in lista:
print cuadrado(numero)
def make_sumador_lambda ( k ):
return lambda x : x + k
mas_dos = make_sumador_lambda (2)
print mas_dos (1)
print mas_dos (2)
Cualquier función puede guardarse en cualquier parte.
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)
Filosofı́a
Trabajar sobre listas ⇒ Abstraer la iteración
Aplica una función sobre cada ítem de una lista y devuelve una lista donde se le aplicó la función a cada elemento
nueva_lista = map(función, lista)
lista = [0,1,2,4,5,6,7,8,9]
lista_nueva = map(lambda x: x**2, lista)
print lista_nueva
reduce los ítems de una lista aplicando una función reductora, devuelve un solo valor
valor = reduce(función, lista, (primero))
lista = [0,1,2,4,5,6,7,8,9]
sumatoria = reduce(lambda x, y: x+y, lista)
print sumatoria
reduce los ítems de una lista aplicando una función reductora, devuelve un solo valor
valor = reduce(función, lista)
coteja que los elementos de una lista cumplan con cierta condición expresada en una función boolean.
nueva_lista = filter(funcion, lista)
lista = [0,1,2,4,5,6,7,8,9]
pares = filter(lambda x: x % 2 == 0, lista)
print pares
Emparejar los elementos de dos listas ...
zip ( 'hola' , range (3))
Verdadero si todos son verdaderos ...
all ([ True , [] , True ])
Verdadero si alguno es verdadero ...
any ([ True , [] , True ])
Es una construcción compacta que permite mapear y/o filtrar una lista en otra aplicando una función a cada elemento de la lista, opcionalmente la lista original puede ser filtrada
Crear una lista con los cuadrados de los dígitos:
print [digito**2 for digito in range(10)]
Crear una lista con los cuadrados de los digitos pares
print [digito**2 for digito in range(10) if digito % 2 == 0]
Ejercicio 1
Escriba una función de orden superior que permita ejecutar una función n veces, donde n y la función debes ser argumentos.
Ejercicio 2
Implemente las funciones map, filter y reduce por sus propias manos.
Ejercicio 3
Sin utilizar bucles, implemente una función que reciba dos listas y devuelva otra lista con los productos de cada par de números.
Ejercicio 4
Realice el ejercicio anterior (Ejercicio 5), utilizando listas por comprensión.