sirve que programacion para español dummies curso python functional-programming

que - ¿Por qué Python no es muy bueno para la programación funcional?



python para dummies español pdf (9)

Además de otras respuestas, una de las razones por las que Python y la mayoría de los otros lenguajes de paradigmas múltiples no son adecuados para una verdadera programación funcional es que sus compiladores / máquinas virtuales / tiempos de ejecución no admiten la optimización funcional. Este tipo de optimización se logra cuando el compilador comprende las reglas matemáticas. Por ejemplo, muchos lenguajes de programación admiten una función o método de map . Esta es una función bastante estándar que toma una función como un argumento y una iterable, ya que el segundo argumento aplica esa función a cada elemento de la iterable.

De todos modos, resulta que map( foo() , x ) * map( foo(), y ) es lo mismo que map( foo(), x * y ) . El último caso es en realidad más rápido que el primero porque el primero realiza dos copias donde el último realiza una.

Los mejores lenguajes funcionales reconocen estas relaciones de base matemática y realizan la optimización automáticamente. Los lenguajes que no están dedicados al paradigma funcional probablemente no se optimizarán.

Siempre he pensado que la programación funcional se puede hacer en Python. Por lo tanto, me sorprendió que Python no recibiera mucha mención en this pregunta, y cuando se mencionó, normalmente no fue muy positivo. Sin embargo, no se dieron muchas razones para esto (se mencionó la falta de coincidencia de patrones y los tipos de datos algebraicos). Así que mi pregunta es: ¿por qué Python no es muy bueno para la programación funcional? ¿Hay más razones que su falta de coincidencia de patrones y tipos de datos algebraicos? ¿O son estos conceptos tan importantes para la programación funcional que un lenguaje que no los admite solo puede clasificarse como un lenguaje de programación funcional de segunda clase? (Tenga en cuenta que mi experiencia con la programación funcional es bastante limitada).


Guido tiene una buena explicación de esto here . Aquí está la parte más relevante:

Nunca he considerado que Python esté muy influido por lenguajes funcionales, sin importar lo que diga o piense la gente. Estaba mucho más familiarizado con lenguajes imperativos como C y Algol 68 y aunque había hecho funciones de objetos de primera clase, no veía a Python como un lenguaje de programación funcional. Sin embargo, anteriormente, estaba claro que los usuarios querían hacer mucho más con listas y funciones.

...

También vale la pena señalar que, aunque no imaginé Python como un lenguaje funcional, la introducción de cierres ha sido útil en el desarrollo de muchas otras funciones avanzadas de programación. Por ejemplo, ciertos aspectos de las clases de estilo nuevo, los decoradores y otras características modernas dependen de esta capacidad.

Por último, a pesar de que se han introducido varias funciones de programación funcional a lo largo de los años, Python aún carece de ciertas funciones que se encuentran en los lenguajes de programación funcionales "reales". Por ejemplo, Python no realiza ciertos tipos de optimizaciones (por ejemplo, recursión de la cola). En general, debido a la naturaleza extremadamente dinámica de Python, es imposible realizar el tipo de optimización en tiempo de compilación conocida de lenguajes funcionales como Haskell o ML. Y eso está bien.

Saco dos cosas de esto:

  1. El creador del lenguaje realmente no considera que Python sea un lenguaje funcional. Por lo tanto, es posible ver características "funcionales-esque", pero es poco probable que veas algo que sea definitivamente funcional.
  2. La naturaleza dinámica de Python inhibe algunas de las optimizaciones que se ven en otros lenguajes funcionales. Por supuesto, Lisp es tan dinámico (si no más dinámico) como Python, por lo que esta es solo una explicación parcial.

La pregunta a la que hace referencia pregunta qué idiomas promueven la programación funcional y la OO. Python no promueve la programación funcional a pesar de que funciona bastante bien.

El mejor argumento contra la programación funcional en Python es que los casos de uso imperativo / OO son cuidadosamente considerados por Guido, mientras que los casos de uso de programación funcional no lo son. Cuando escribo el imperativo Python, es uno de los idiomas más bonitos que conozco. Cuando escribo Python funcional, se vuelve tan feo y desagradable como su lenguaje promedio que no tiene un BDFL .

Lo que no quiere decir que sea malo, solo que tienes que trabajar más de lo que lo harías si cambias a un lenguaje que promueva la programación funcional o cambies a la escritura OO Python.

Aquí están las cosas funcionales que extraño en Python:

  • No hay coincidencia de patrones ni recursión de la cola, lo que significa que sus algoritmos básicos deben escribirse de forma imperativa. La recursión es fea y lenta en Python.
  • Una pequeña biblioteca de listas y ningún diccionario funcional significa que usted mismo tiene que escribir muchas cosas.
  • Ninguna sintaxis para el curry o la composición significa que el estilo sin puntos está tan lleno de puntuación como los argumentos que pasan explícitamente.
  • Iteradores en lugar de listas perezosas significa que debe saber si desea eficiencia o persistencia, y para dispersar las llamadas a la list si desea persistencia. (Los iteradores son de un solo uso)
  • La sintaxis imperativa simple de Python, junto con su simple analizador LL1, significa que una mejor sintaxis para expresiones if y lambda-expresiones es básicamente imposible. A Guido le gusta así, y creo que tiene razón.

Nunca llamaría "funcional" a Python, pero cada vez que programo en Python, el código invariablemente termina siendo casi puramente funcional.

Es cierto que esto se debe principalmente a la excelente comprensión de la lista. Por lo tanto, no necesariamente sugeriría Python como un lenguaje de programación funcional, pero sugeriría la programación funcional para cualquiera que use Python.


Otra razón no mencionada anteriormente es que muchas funciones y métodos incorporados de tipos incorporados modifican un objeto pero no devuelven el objeto modificado. El código funcional sería más limpio y conciso. Por ejemplo, si some_list.append (some_object) devolvió some_list con some_object anexado.


Permítame demostrarlo con un fragmento de código tomado de una respuesta a una pregunta de Python "funcional" en SO

Pitón:

def grandKids(generation, kidsFunc, val): layer = [val] for i in xrange(generation): layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer)) return layer

Haskell:

grandKids generation kidsFunc val = iterate (concatMap kidsFunc) [val] !! generation

La principal diferencia aquí es que la biblioteca estándar de Haskell tiene funciones útiles para la programación funcional: en este caso iterate , concat y (!!)


Python es casi un lenguaje funcional. Es "lite funcional".

Tiene características adicionales, por lo que no es lo suficientemente puro para algunos.

También carece de algunas características, por lo que no es lo suficientemente completo para algunos.

Las características que faltan son relativamente fáciles de escribir. Echa un vistazo a mensajes como this en FP en Python.


Scheme no tiene tipos de datos algebraicos ni coincidencia de patrones, pero ciertamente es un lenguaje funcional. Cosas molestas sobre Python desde una perspectiva de programación funcional:

  1. Lambdas lisiados. Dado que Lambdas solo puede contener una expresión, y no puede hacer todo tan fácilmente en un contexto de expresión, esto significa que las funciones que puede definir "sobre la marcha" son limitadas.

  2. Los ifs son declaraciones, no expresiones. Esto significa, entre otras cosas, que no se puede tener una lambda con un If en su interior. (Esto está arreglado por ternaries en Python 2.5, pero se ve feo).

  3. Guido amenaza con eliminar el mapa, filtrar y reducir de vez en cuando

Por otro lado, Python tiene cierres léxicos, Lambdas y listas de comprensión (que son realmente un concepto "funcional", ya sea que Guido lo admita o no). Hago mucha programación de "estilo funcional" en Python, pero casi no diría que es ideal.


Una cosa que es realmente importante para esta pregunta (y las respuestas) es lo siguiente: ¿Qué demonios es la programación funcional y cuáles son sus propiedades más importantes? Trataré de dar mi opinión al respecto:

La programación funcional se parece mucho a escribir matemáticas en una pizarra. Cuando escribe ecuaciones en una pizarra, no piensa en un orden de ejecución. No hay (típicamente) ninguna mutación. No vuelves al día siguiente y lo miras, y cuando vuelves a hacer los cálculos, obtienes un resultado diferente (o puedes, si has tomado un poco de café recién hecho :)). Básicamente, lo que está en la pizarra está ahí, y la respuesta ya estaba allí cuando empezaste a escribir cosas, simplemente no te has dado cuenta de lo que es.

La programación funcional es muy parecida a eso; no cambias las cosas, solo evalúas la ecuación (o en este caso, "programa") y averiguas cuál es la respuesta. El programa sigue ahí, sin modificaciones. Lo mismo con los datos.

Clasificaría las siguientes como las características más importantes de la programación funcional: a) transparencia referencial: si evalúa la misma afirmación en algún otro momento y lugar, pero con los mismos valores de variables, seguirá teniendo el mismo significado. b) sin efectos secundarios: no importa cuánto tiempo mires la pizarra, la ecuación que otro hombre está mirando en otra pizarra no cambiará accidentalmente. c) las funciones son valores también. que se puede pasar y aplicar con, o a, otras variables. d) composición de la función, puede hacer h = g · f y así definir una nueva función h (..) que es equivalente a llamar a g (f (..)).

Esta lista está en mi orden de prioridad, por lo que la transparencia referencial es la más importante, seguida de ningún efecto secundario.

Ahora, si analiza Python y comprueba qué tan bien el lenguaje y las bibliotecas son compatibles con estos aspectos, entonces estará en el buen camino para responder a su propia pregunta.