Programación funcional
En esta clase veremos un apartado de Python que lo dota de gran potencia y que no existe en otro tipo de lenguajes: la programación funcional.
En Python se pueden usar funciones como si otro tipo de datos se tratara, es decir, se pueden definir funciones, invocar funciones pasandole parámetros, pasar funciones como parámetros,etc
Pej.
supongamos que tenemos dos funciones, una para sumar y otra para restar definidas
def sumar(x,y):
return x+y
def restar(x,y):
return x-y
pero también podemos definir una función que como parámetro tenga otra función
def operar(f,x,y):
return f(x,y)
Entonces podemos sumar dos números de la forma
operar(suma,x,y)
y restar dos número de la forma
operar(restar,x,y)
Claro os podéis preguntar para qué usar este tipo de notación si con la programación tradicional ya se pueden definir funciones sin pasar funciones como parámetro??
La programación funcional en Python nos va a permitir hacer toda una serie de construcciones y darle unas funcionalidades que con otro tipo de lenguajes es más complicado de realizar.
La programación funcional se usa mucho para el tratamiento de listas.
Funciones filter, map y reduce
La función filter aplica una función booleana a cada elemento de una lista creando otra lista con los elementos que cumplen la condición
Pej
def grande(x):
return x>100
filter(grande,[5,500,200,20,150])
retornaria
[500,200,150]
La función map aplica una función a cada elemento de una lista creando otra lista con el resultado de cada operación
Pej
def doble(x):
return x+x
filter(doble,[1,10,50])
retornaria
[2,20,100]
La función reduce es quizás la más extraña de las tres y consiste en aplicar una función como si fuera una suma y tomando los parámetros de la lista de partiéndola en dos trozos
Pej
def multiplicar(x,y):
return x*y
filter(multiplicar,[2,3,5])
retornaria
30 como resultado de 2*3*5
Generadores
En Python se pueden definir listas con los llamados generadores que son objetos que permiten usar valores de la lista instanciados solo en el momento que se usan.
Al principio es confuso pero la idea es no crear la lista en el momento de la definición si no solo de forma parcial cuando se usa.
Esto es muy conveniente para listas de gran tamaño que de otra manera usaban mucha memoria.
pej
para crear una lista de los 1000 primeros números podríamos usar
range(1000)
Comprehensions
En Python se puede usar una notación especial para crear una lista a partir de otra llamada Comprehensions
La notación es
[ f(x) for x in lista ]
y que define una lista al aplicar una función a cada elemento de la lista dada
Pej
[ 2*x for x in range(10,15) ]
daria la lista
[ 20,22,24,26,28,30 ]
También se puede aplicar una condición de la forma
[ f(x) for x in lista if condicion ]
Pej
[ 2*x for x in range(10,15) if x%2=0 ]
daria la lista (lista solo de los elementos pares)
[ 20,24,28 ]
Este tipo de notación al principio cuesta de entender y aplicar pero una vez dominado da bastante potencia al lenguaje.