Python中的卷曲--初学者的介绍

201 阅读3分钟

在这篇文章中,我们将尝试理解 "*Curry"这个概念,*它的优点,以及它在python中的实现。Currying实际上是为了纪念数学家和逻辑学家Haskell Curry而命名的。它是功能设计模式之一。它主要用于解决问题和根据数学函数的概念设计的程序。

什么是设计模式?

设计模式为一个常见或重复出现的问题提供了一个标准的解决方案。设计模式的使用非常方便,可以帮助开发者提高他们所做的代码的可读性。

什么是Currying?

咖喱是一种功能设计模式,主要用于将有多个参数的函数缩减为一连串的函数,每个参数只需一个。

比如说

function_mult(1,2,3) ---> function_mult(1)(2)(3)

考虑左边的函数,它执行乘法运算,有三个参数1、2、3,然后考虑所有三个参数的值产生输出。

在执行Currying后,这个函数被改变成一个只有一个参数的函数,这个函数接受第一个参数(这里是1),并返回一个接受第二个参数(这里是2)的新函数,然后这个函数再次返回一个接受第三个参数(这里是3)的新函数,然后产生最终的输出。

这就是 currying 如何将一个有多个参数的函数变成一个由单个参数的多个函数组成的链。

我们如何在 Python 中实现 Currying 呢?

为了理解 currying 的实现,让我们首先定义一个有多个参数的函数。

考虑下面这个函数,它对提供的参数进行乘法运算:

def mult(x, y, z):
  return x * y * z

ans = mult(10, 20, 30)
print(ans)

输出

6000

咖喱的最初步骤是将多个参数绑定在一起。考虑到该函数有n个参数,我们需要绑定所有这些参数,为此,我们固定带有第一个参数的函数,并创建一个新的函数,该函数需要(n - 1)个参数。现在我们继续创建新的函数,直到函数所取的参数数为1。

在Python中,我们使用来自functools的标准Python函数部分:

from functools import partial

mult_10 = partial(mult, 10)
mult_10_20 = partial(mult_10, 20)
print(mult_10_20(30))

输出

6000

使用装饰器卷取

通过使用装饰器,可以更有效地实现诅咒。装饰器将代码或功能包裹在一个函数周围,以增强该函数的功能。为此,我们使用不同的标准python函数。(要了解更多关于装饰器的信息 ,请点击这里)

首先,我们使用签名,它有助于统计传递给函数的参数的数量。

部分函数在这里有助于将一个有n个参数的函数衍生为一个参数较少的函数

from inspect import signature
def curry(func):

  def inner(arg):

    #checking if the function has one argument,
    #then return function as it is
    if len(signature(func).parameters) == 1:
      return func(arg)

    return curry(partial(func, arg))

  return inner

#using cuury function on the previous example function
@curry
def mult(x, y, z):
  return x * y * z


print(mult(10)(20)(30))

输出

6000

开始咖喱

咖喱是一种功能设计模式。使用curry的主要目的是将一个给定的函数简化为一连串的绑定函数,这使得开发人员的工作更加方便,并使解决方案更加可读。在这篇文章中,我们试图了解Python语言中Curry的工作和实现。