En python, cómo usar functools para implementar programación funcional

¡Acostúmbrate a escribir juntos! Este es el día 14 de mi participación en el "Desafío de actualización de abril del nuevo plan diario de Nuggets", haga clic para ver los detalles del evento .

He compartido la programación funcional contigo antes. Primero sentí que la programación funcional era genial. Cuando chateabas con amigos y colegas, ¿hablaste sobre la programación funcional? La programación funcional era muy popular en ese momento, principalmente debido al préstamo de js. Con nodejs y npm ya están en el top3, y firmemente en el top3. Debido a que las funciones en js son ciudadanos de primera clase, son inherentemente amigables con la programación funcional, oh, volvamos a python, porque amamos a js, y generalmente nos desviamos cuando hablamos de eso.

función parcial

Antes de comenzar a presentar funciones parciales y cómo implementar funciones parciales en python, veamos una función simple, esta función de suma se usa para sumar dos números, python es un lenguaje débilmente tipificado, pero también tiene su propio sistema de tipos, si el type es claro, puede dar el tipo después del parámetro, que se estima para ahorrarle al intérprete algún tipo de trabajo de inferencia.

import functools

def add(a:float, b:float)->float:
    return a + b
复制代码

Bien definida tal función, pensamos además, en programación funcional, esperamos que la entrada y la salida sean únicas. La programación funcional extrae principalmente la constante, es decir, la parte determinista del programa, para reducir la complejidad del programa. ¿Qué es la función parcial?¿Cuál es el efecto de la función parcial sobre lo anterior?

Una comprensión simple de una función parcial es una encapsulación secundaria de la función original, que consiste en vincular previamente algunos de los parámetros de la función existente como valores específicos para obtener una nueva función, que se denomina función parcial.

Currying para implementar funciones parciales

Luego, las funciones parciales se pueden implementar mediante curry, no solo en JavaScript sino también en otros lenguajes de programación. Currying es una transformación de una función, lo que significa convertir una función de una f (a, b, c) invocable a una f (a) (b) (c) invocable. Es decir, dejemos que nuestra función add cambie de aceptar dos parámetros al mismo tiempo a aceptar dos parámetros add(2)(3) en un cierto orden.

def make_add(a:float)->Callable[[float],float]:
    def add_inner(b:float)->float:
        return a + b

    return add_inner

add_2 = make_add(2)
复制代码

Sin embargo, no estamos satisfechos y podemos optimizarlo aún más. Aquí definimos una función. En lugar de definir explícitamente una función, podemos definir una función lambda y devolverla.

def make_add(a:float)->Callable[[float],float]:
    return lambda b: add(a,b)

add_2 = make_add(2)
复制代码

Implementar función parcial basada en functools

Si usa el método parcial provisto por la biblioteca functools para implementar una función parcial, esto puede simplificar la implementación de la función parcial. Esta función parcial recibe el primer parámetro como el nombre de la función que se va a envolver, y el siguiente parámetro es el parámetro de la función original, se especifica el valor y lo explicamos a través del código

add_2 = functools.partial(add,2)
复制代码

También podemos preasignar ambos parámetros al mismo tiempo, lo siguiente implícitamente pre-especifica valores para ambos parámetros de la función de suma, por supuesto, los valores también se pueden especificar explícitamente.

add_2_3 = functools.partial(add,2,3)
复制代码

También se puede obtener una función parcial preasignando b

add_3 = functools.partial(add,b=3)
复制代码

También puede hacerte sentir un poco antinatural, es decir, también podemos volver a cambiar la b preasignada al llamar, de hecho, a veces es más flexible y tiene menos restricciones, lo que puede ser propenso a problemas.

>>> add_3(2,b=5)
7
复制代码

Supongo que te gusta

Origin juejin.im/post/7086332127117049887
Recomendado
Clasificación