Programaci贸n Funcional En Python

Fecha de publicaci贸n: 14 Octubre 2020
Tiempo de lectura: 4 min.
Premium: False
N煤mero de visitas: 76


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, la funci贸n map retorna un objeto de tipo map object. Objeto que f谩cilmente podemos convertir a una lista.

En este caso como la funci贸n que aplicamos es una funci贸n bastante sencilla, podemos f谩cilmente reemplazarla por 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]

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'
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. 馃悕

Comentarios

Para poder conocer tu opini贸n es necesario ser un usuario autenticado. Login