Programación Funcional - Lambda, Map, Filter y Reduce

Índice

¿Que es la Programacion Funcional?

Es un estilo de programacion que (como lo indica su nombre) se basa en funciones.
La programación funcional busca usar funciones puras. Las funciones puras no tienen efectos secundarios, no manejan datos mutables o de estado, y devuelven un valor que depende solo de sus argumentos.

Ejemplo: Funciones puras e impuras.


#Función pura
def pure_func(x, y):
    temp = x + 2 * y
    return temp / (2 * x + y)

#Función impura
list = [
def impure(arg):
    list.append(arg)

La función "impure" es una función impura porque cambio el estado de list.

En cambio, la función "pure_func" es una función pura porque devuelve valores que dependen de sus argumentos.


Utilizando Lambda, Map, Filter y Reduce.

Cuando tenemos que realizar operaciones sobre listas, en lugar de utilizar los clásicos loops, podemos utilizar las funciones Map, Reduce, y Filter.

Operador lambda: 
El operador lambda o función lambda, es una forma de crear funciones anónimas, es decir, funciones sin nombre. Estas funciones son desechable, es decir, solo se necesitan donde se han creado. Las funciones lambda se utilizan principalmente en combinación con las funciones Map, Filter y Reduce.

La sintaxis general de una función lambda es bastante simple:
lambda argument_list : expression


El operador lambda o función lambda, es una forma de crear funciones anónimas, es decir, funciones sin nombre. Estas funciones son desechables, es decir, solo se nesecitan donde se han creado. Las funciones lambda se utilizan principalmente en combinatorio con las funciones Map, Filter y Reduce.


La sintaxis general de una funcion lambda es bastante simple:
lambda argument_list : expresison

Ejemplo:


#Función lambda que devuelve la suma de sus dos argumentos:
f = lambda x, y : x + y
f(2 + 2)

#Resultado:

#Segundo ejemplo de lambda
#Función lambda que devuelve la raíz cuadrada de su argumento
a = lambda x : x**1/2
a(233)

#Resultado:
15,2643

Como pueden ver, la función lambda nos devuelve valores que dependen de sus argumentos, esto significa que es una función pura.

 

Operador Map: 

El operador Map, toma una función y un iterable como argumentos, y devuelve un nuevo iterable con la función aplicada a cada argumento . Ejemplo:



#Ejemplo del operador Map
def add_five(x):
    return x + 5

nums = [11, 25, 34, 100, 23]
result = list(map(add_five, nums))
print(result)

#Resultado:
[16, 30, 39, 105, 28]


Como pueden ver, "map" nos a devuelto una lista con todo los elementos de la lista "nums", vemos que a cada elemento le sumo 5.


Si usáramos el operador lambda en vez de declarar la función "add_five", el resultado seria el mismo. Veamos un ejemplo:



#Ejemplo del operador Map y Lambda
nums = [11, 25, 34, 100, 23]
result = list(map(lambda x:x+5, nums))
print(result)

#Resultado:
[16, 30, 39, 105, 28]


Como pueden ver el resultado es el mismo, increíble, ¿Verdad?.
Otra cosa a tener en claro es que en estos dos ejemplo, que para convertir el resultado en una lista, se hace uso del método "list".
 
Operador Filter:

El operado filter (función, lista) ofrece una forma elegante de filtrar todos los elementos de una lista, para los que la función de función devuelve True.  
El operador filter(f, l) necesita una función f como primer argumento. f devuelve un valor booleano, es decir, verdadero o falso. Esta función se aplicará a cada elemento de la lista. Solo si f devuelve True, el elemento de la lista se incluirá en la lista de resultados.


#Usando el operador Filter
nums = [0, 2, 5, 8, 10, 23, 31, 35, 36, 47, 50, 77, 93]
result = filter(lambda x: x % 2 == 0, nums)
print(result)

#Resultado:
[2, 8, 10, 36, 50]

Como pueden observar, el operador filter no incluyo a los elementos que no fueran divisibles entre 2, otra cosa es que hacemos uso de lambda, ya que es utilizado especialmente para este tipo de situaciones.

 Operador Reduce:
 La función Reduce reduce los valores de la lista a un solo valor aplicando una funcion reductora. El primer argumento es la función reductora que vamos a aplicar y el segundo argumento es la lista.




#Usando el operado filter
from functools import reduce #en python3 reduce se encuentra en modulo functools

nums = [47,11,42,13]
result = reduce(lambda x, y: x + y, nums)
print(result)

#Resultado:
113

Para entender un poco mejor al operador reduce, veamos una imagen que nos explica su procedimiento.

Veranschulichung von Reduce 
 Como pueden ver, reduce suma cada uno de los elementos hasta solo dejar un valor, en este caso "113", ¿Que pasaría si en vez de sumar, multiplicamos cada uno de los valores?, buena pregunta, espero y puedas contestarla en los comentarios.
La programación funcional no solo se resume en estos 4 operadores, en articulo posteriores explicare más acerca de todo esto. Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes. 😀 

 
 

  1. madtyn dice:

    Interesante, pero ahora casi todas las tendencias apuntan a usar listas y conjuntos por comprensión, dejando casi sin usar map() y filter(), y sólo reduce() para casos muy aislados.

    1. Luis Salcedo dice:

      Sí, rara vez uso estos operadores, pero creo es que es importante conocerlos y saber como funcionan, para cuando llegue el día, pues no estaremos tan perdidos :D.

  2. Unknown dice:

    Gracias por la explicación; estoy aprendiendo Python y me parece muy interesante el artículo.

  3. Oswaldo Zorrilla dice:

    Excelente explicación y muy didáctica.

  4. RazeK dice:

    Gracias por el articulo, todo explicado de manera muy sencilla. Saludos!!

  5. Anónimo dice:

    Buenos días,
    en el filter hay algo raro, ya que 0%2 == 0 y no aparece en el resultado.

    Además para mostrar el resultado tengo que convertirlo en una lista, aunque eso no sé si será por la versión de Python.

    nums = [0, 2, 5, 8, 10, 23, 31, 35, 36, 47, 50, 77, 93]
    result = filter(lambda x: x % 2 == 0, num)
    print(list(result))
    [0, 2, 8, 10, 36, 50]

    Salu2

    1. Anónimo dice:

      Nada raro en el filter, el 0 aparece en la lista resultante.
      En cuanto al resultado que te da, no es por la versión de Python.
      La función map y filter devuelven un iterador, es decir, un elemento que se puede recorrer. Sólo tienes que convertirlo a lista si quieres mostrar el resultado, pero si se lo pasas a otra función para que recorra los elementos resultantes, lo entenderá perfectamente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey