Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuáles son las similitudes y diferencias entre Python y Lisp en programación funcional?

¿Cuáles son las similitudes y diferencias entre Python y Lisp en programación funcional?

Capacidades funcionales inherentes de Python

Desde Python 1.0, Python ha tenido la mayoría de las características enumeradas anteriormente. Pero como la mayoría de las funciones de Python, aparecen en un lenguaje que es una combinación de funciones. ? Muy parecido a las funciones POO (programación orientada a objetos) de Python, puedes usar tantas como quieras y dejar el resto en paz (hasta que las necesites más adelante). En Python 2.0, se agregó el muy útil "azúcar de sintaxis" de listas por comprensión. Aunque las listas por comprensión no añaden nada nuevo, hacen que muchas funciones antiguas se vean mucho mejor.

Los elementos básicos de la programación funcional en Python incluyen funciones map(), reduce(), filter() y operador lambda (operador). En Python 1.x, la función apply() también se puede usar de manera muy conveniente para usar directamente el valor de retorno de la lista de una función a otra función. Python 2.0 proporciona una sintaxis mejorada para esto. Puede resultar sorprendente que casi cualquier programa Python pueda escribirse utilizando tan pocas funciones (y operadores básicos); lo que es aún más especial es que casi no hay ninguna declaración de control de flujo de ejecución.

Todo (if, elif, else, afirmar, intentar, excepto, finalmente, for, break, continuar, while, def) se puede resolver simplemente usando funciones y operadores en programación funcional. Se puede manejar bien. en un estilo de programación funcional. Aunque excluir realmente todo uso de comandos de control de flujo de su programa solo puede tener sentido si desea participar en la competencia "Programación caótica de Python" (escribir código Python que se parezca mucho al código Lisp), es muy importante para comprender la programación funcional. El control de flujo a través de funciones y recursividad es valioso.

Eliminar declaraciones de control de flujo

Lo primero que hay que considerar al realizar el ejercicio de eliminación es que Python en realidad "cortocircuita" la evaluación de expresiones booleanas. Esto nos da una versión de expresión de la declaración de rama if/elif/else (asumiendo que cada rama solo llama a una función, que se reorganiza fácilmente para hacerlo).

Aquí se explica cómo hacerlo:

Cortocircuito de llamadas condicionales en Python

Python

# Control de flujo normal basado en declaraciones

if :? func1()

elif : func2()

else: func3()

# Expresión equivalente de "cortocircuito"

( y func1()) o ( y func2()) o (func3())

# Ejemplo de expresión de "cortocircuito"

>>> x = 3

>>> def pr(s): devuelve s

>>> (x==1 y pr('one') ) o (x==2 y pr('dos')) o (pr('otro'))

'otro'

>>> x = 2

>>> (x==1 y pr('uno')) o (x==2 y pr('dos')) o (pr('otro'))

'dos '

Nuestra versión de expresión de la llamada condicional puede parecer nada más que un truco, sin embargo, es más preocupante si notamos que el operador lambda debe devolver una expresión. Dado que, como hemos demostrado, las expresiones pueden contener un condicional mediante un cortocircuito, las expresiones lambda son un medio completamente general para expresar el valor de retorno de un condicional. Pongamos un ejemplo:

Lambda en cortocircuito en Python

Python

>>> pr = lambda s:s

> > > namenum = lambda x: (x==1 y pr("uno")) \

....?o (x==2 y pr("dos")) \

....?o (pr("other"))

>>> namenum(1)

'uno'

> >> namenum(2)

'dos'

>>> namenum(3)

'otro'

Aplicar el funcionan como Objetos con primacía

El ejemplo anterior ha demostrado que las funciones tienen primacía en Python, pero es un poco eufemístico. Cuando usamos operaciones lambda para crear un objeto de función, lo que obtenemos es completamente genérico. Esencialmente, podemos vincular nuestros objetos a los nombres "pr" y "namenum" exactamente de la misma manera que podemos vincular el número 23 o la cadena "spam" a estos nombres. Pero así como podemos usar el número 23 directamente sin vincularlo a ningún nombre (es decir, se puede usar como argumento para una función), también podemos usar directamente el objeto de función que creamos usando una lambda. No es necesario vincularlo. a cualquier nombre. En Python, una función es simplemente otro valor que podemos manipular de alguna manera.

Lo que más hacemos con los objetos con primacía es pasarlos como parámetros a las funciones map(), reduce() y filter() inherentes a la programación funcional. El primer parámetro aceptado por estas tres funciones es un objeto de función.

map() ejecuta la función que se le pasa como parámetro una vez para el contenido correspondiente a cada elemento en una o más listas especificadas y finalmente devuelve una lista de resultados.

reduce() ejecuta la función que se le pasa como parámetro una vez para cada sucesor y el resultado acumulativo del resultado final, por ejemplo, reduce(lambda n,m:n*m, range(1, 10)) significa encontrar "el factorial de 10" (en otras palabras, multiplicar cada término por el producto del anterior)

filter() usa la función que se le pasa como argumento para filtrar un Todos los elementos de la lista se "evalúan", devolviendo una lista seleccionada de todos los elementos que pasan la prueba de esa función.

A menudo pasamos objetos de función a nuestras propias funciones definidas, pero normalmente estas funciones personalizadas son alguna forma de combinación de las funciones integradas mencionadas anteriormente.

Al combinar estas tres funciones integradas de la programación funcional, se puede lograr una increíble variedad de operaciones de "flujo de ejecución" (todas sin declaraciones, solo expresiones).