Introducción a la programación Funcional en Python


#1

Andros Fenollosa Hurtado

Abstract:
“Ya se objetos, ¿para que usar programación funcional?” Si lees el título y pasa esta frase por tu cabeza… ¡necesitas urgentemente ver esta charla! Aprovecharé la plasticidad de Python para dar una breve explicación de que es la programación funcional, además de listar sus diferencias respecto al paradigma orientado a objetos, enseñar sus superpoderes, algunos ejemplos reales y ver otros lenguajes que pueden ayudarte a mejorar como desarrollador.

Bio:
Fullstack, docente durante ya casi una década, Project Manager en su propio estudio de APPs, colaborador en el Podcast “República Web”, bloguero incansable y locamente enamorado del software libre en todos los estratos del alma humana manteniendo varios proyectos.


#2

Respecto a map y filter, entiendo que se pueden obtener lo mismos resultados utilizando list comprehensions. De hecho creo haber leído que usar list comprehensions es más rápido. ¿No viola el hecho de tener varias formas de conseguir lo mismo el principio de Python de “hay una única manera obvia de hacer las cosas”? ¿Es por eso que se eliminaron por un tiempo?


#3

Hola, solo vengo a darte las gracias por esta charla, a parte de ser interesante está muy bien contada.

A mí también me resetea el cerebro jajaja y todavía estoy en el inicio de la programación funcional.

Saludos.


#4

En el ejemplo de añadir_poder uno es forzado a escribir 2 líneas porque update no devuelve el diccionario. Eso pasa mucho en Python.

Pero, una alternativa para escribir el lambda con una línea pudo haber sido usar la expresión:

{**superheroe, **{'poder': randint(0, 100)}}


#5

Muy interesante esta charla, aunque tengo que reconocer que me cuesta bastante imaginar un software muy complejo desarrollado con programación funcional y que sea relativamente fácil de mantener. Imagino que es por eso por lo que existen conceptos como serverless, ¿no? Dudo que vaya a aprender algún lenguaje funcional pronto, pero por lo menos puedo intentar usar algunas de las prácticas de este paradigma.

Un saludo.


#6

Si, por supuesto. La impresión que tengo que es tanto map, como filter, como reduce están un poco con calzador. Otras herramientas pueden lograr objetivos similares sin ensuciar tanto la sintaxis (lo comento por esa sensación que pueden tener aquellos que no tienen el ojo entrenado). Y en varias pruebas de rendimiento he notado resultados similares.


#7

No los eliminaron por un tiempo.

map, filter y reduce aparecieron en Python no recuerdo en que versión y no han desaparecido. Lo que sí sucedió fue que reduce lo reubicaron: lo movieron de los builtins a functools.

Sí hubo la intención de no incluirlos en Python3. Guido mismo es quien quería retirarlos, y su argumento era precisamente lo que mencionas: lo que puedes hacer con map y filter lo puedes hacer con expresiones por comprensión.

Las razones por las cuales cambió de opinión no las recuerdo.


#8

Gracias a ti por lanzarte a dejarme el comentario :grin:
Es duro porque te obliga a volver a andar, sobretodo si has sido educado con la programación orientada a objetos. Los problemas debes resolverlos desde un punto diferente. Sabes que estás ahí cuando te preguntas: “¿Donde ha estado esto toda mi vida?” :joy: Pero bueno, no es incompatible con trabajar con Python; ni mucho menos.


#9

¡Eso es! Suelo tirar de pyfunctions para ahorrar esa línea “extra”.
Tomo nota del truco. No lo conocía, ¡gracias!


#10

Antes de la programación orientada a objetos se hacía software, e incluso complejo como sistemas operativos :smiley: No esta tanto en el paradigma sino en el patrón de diseño. Te recomiendo dar un vistazo a los libros de Clean Code.
No verás su potencial hasta que te metas de lleno, sino lo verás con recelo, con desprecio (como el alien de las diapositivas). Pero puedes empezar sustituyendo ciertos bucles con las funciones de primer grado.
Suerte!

Aprovecho para responderte @jgomo3:
Aquí tienes la historia completa: https://developers.slashdot.org/story/13/08/25/2115204/interviews-guido-van-rossum-answers-your-questions
Demasiada herencia de la PF.


#11

Un poco de contexto e historia:

https://www.artima.com/weblogs/viewpost.jsp?thread=98196


#12

Con la resiente publicación de Python 3.9 puedes usar el operador de unión | para esto:

superheroe | {'poder': randint(0, 100)}

Me parece más limpio.


#13

Simplemente sublime. Una solución a la altura del zen de python