Programación funcional en Python



@eduardo_gpg

Número de visitas 2432

Tiempo de lectura 4 min

14 Octubre 2020

Una de las principales características de Python, es que este, es un lenguaje multiparadigma, es decir podemos desarrollar proyectos utilizando un enfoque orientado a objetos, imperativo, concurrente, e inclusive (en menor medida) funcional.

Es por ello que para este post trabajaremos con las 3 principales funciones en cuanto a programación funcional se refiere. Estamos hablando de la función map, filter y reduce.

Antes de entrar de lleno en materia será necesario hacer un breve repaso sobre funciones anónimas. Y para ello te comparto un post en donde te lo explicamos más en detalle. 🐍

Bien, sin más dilación, comencemos.

Función Map

Comencemos explicando la función map.

Verás, map nos permite aplicar una función sobre cada uno de los elementos dentro de una colección. Ya sea para una lista, una tupla, un set etc..

Haremos uso de la función map siempre que tengamos la necesidad de transformar el valor de un elemento en otro.

map

La estructura de la función es la siguiente.

map(<función a aplicar>, <objeto iterable>)

Es importante mencionar que, la función a aplicar deberá, de forma obligatoria, retornar un nuevo valor. Es a partir de estos nuevos valores que obtendremos como resultado una nueva colección.

Veamos un ejemplo.

#Obtener el cuadrado de todos los elementos en la lista.

>>> def cuadrado(elemento=0):
...         return elemento * elemento

>>> lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> resultado = list( map(cuadrado, lista) )

>>> resultado
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

A Partir de la versión 3 de Python, la función map retorna un objeto de tipo map object. Objeto que fácilmente podemos convertir a una lista utilizando la función list.

En este caso como la función que aplicamos sea una función "sencilla", podemos fácilmente pasar como argumento una función lambda. El código pudiese quedar de la siguiente manera.

>>> resultado = list( map( lambda elemento : elemento * elemento , lista) )
>>> resultado
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

El código se reduce y obtenemos el mismo resultado. 🥳

Inclusive, podemos almacenar la función en una variable.

>>> cuadrado = lambda elemento : elemento * elemento
>>> resultado = list( map( cuadrado , lista) )

>>> resultado
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Mucho mejor ¿No lo crees?

Función Filter

La función filter, es quizás, una de las funciones más utilizadas al momento de trabajar con colecciones. Como su nombre lo indica, esta función nos permite realizar un filtro sobre los elementos de la colección.

La estructura de la función es la siguiente.

filter(<función a aplicar>, <objeto iterable>)

La función a aplicar , será aplicada a sobre cada uno de los elementos en la colección. Esta función deberá retornar un valor booleano (Verdadero o Falso). Todos aquellos elementos que obtengan como resultado verdadero (True) después de habérseles aplicado dicha función, serán los elementos que pasen el filtro. Es a partir de estos elementos que se crea una nueva colección.

map

Veamos un ejemplo. Obtengamos la cantidad de elementos mayores a 5 en una tupla.

>>> def mayor_a_cinco(elemento):
...       return elemento > 5

>>> tupla = (5, 2 ,6 ,7, 8, 10, 77, 55, 2, 1, 30, 4, 2 ,3)
>>> resultado = tuple(filter( mayor_a_cinco, tupla))

>>> resultado = len(resultado)
>>> resultado
7

A Partir de la versión 3, la función filter retorna un objeto de tipo filter object. Objeto que fácilmente podemos convertir a una tupla.

De igual forma, si nuestra función a aplicar realizar una tarea muy sencilla, podemos reemplazar dicha función por una función lambda.

resultado = tuple(filter( lambda elemento: elemento > 5, tupla))

Función reduce

Usaremos la función reduce cuándo poseamos una colección de elementos y necesitemos generar un único resultado. Como su nombre nos indica, la función reduce nos permitirá reducir los elementos de la colección. Podemos ver a esta función como un acumulador. 🤠

La estructura de la función es la siguiente.

reduce(<función a aplicar>, <objeto iterable>)

Aquí lo importante es detallar la función a aplicar. Esta función debe de poseer, obligatoriamente, dos parámetros. El primer parámetro hará referencia al acumulador, un variable que irá modificando su valor por cada uno de los elementos en la colección. Por otro lado, el segundo parámetro hará referencia a cada elemento de la colección. La función, al igual que las mencionadas anteriormente, deberá de retornar un nuevo valor. Será este nuevo valor el que será asignado al acumulador.

Todo esto suena algo confuso 🤔, y de echo lo es, pero no te preocupes, veamos un par de ejemplos.

Comencemos con un enfoque imperativo. Obtengamos la suma de todos los elementos en la lista.

>>> lista = [1, 2, 3, 4]
>>> acumulador = 0

>>>  for elemento in lista:
...     acumulador += elemento

>>> acumulador
10

Como observamos, para resolver el problema tuvimos que declarar una variable (acumulador). Variable que comienza con el valor de 0. Al recorrer la lista, el valor de nuestra variable incrementa. Su nuevo valor es el valor actual más el valor del elemento en la lista. Hasta aquí no creo que exista duda alguna.

Ahora veamos el mismo ejemplo utilizando la función reduce.

Para utilizar la función reduce tendremos que apoyarnos del módulo functools.

>>> from functools import reduce

>>> lista = [1,2,3,4]

>>> def funcion_acumulador(acumulador=0, elemento=0):
...        return acumulador + elemento

>>> resultado = reduce(funcion_acumulador, lista)
>>> resultado
10

Por cada elemento de la colección se ejecuta la función, funcion_acumulador. La función retorna la suma de los parámetros, este valor es almacenado en nuestro acumulador. Al finalizar la iteración de todos los elementos, reduce retornará el valor del acumulador.

Podemos utilizar reduce mediante una función lambda 😃.

resultado = reduce(lambda acumulador=0, elemento=0: acumulador + elemento, lista)

En este caso el resultado será de tipo entero, ya que así lo he especificado al momento de asignar un valor default al acumulador. Sin embargo, no estamos limitados únicamente a trabajar con valores de tipo entero.

Veamos otro ejemplo. Concatenar todos los elementos de una lista.

>>> lista = ['Python', 'PyWombat', 'Programación funcionar', 'v3.9']
>>> resultado = reduce(lambda acumulador='', elemento='': acumulador + " - " + elemento, lista)
>>> resultado

'Python - PyWombat - Programación funcionar - v3.9'

¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍