什么时候在Python中使用curring函数?

2024-09-28 18:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

When should I write my functions in curried form?不符合我的想法,需要纠正自己。

作为我学习link的一部分,这就是我对函数curring的理解。下面是一个例子:

def curry2(f):
    """Returns a function g such that g(x)(y) == f(x, y)

    >>> from operator import add
    >>> add_three = curry2(add)(3)
    >>> add_three(4)
    """
    def g(x):
        def h(y):
            return f(x, y)
        return h
    return g

在任何应用程序中,如果我知道参数的数量是固定的(比如说2个参数),并且 函数名是normalise_range(比方说),然后我将定义def normalise_range(x, y):函数,并通过调用normalise_range(x, y)在应用程序中直接使用它。

在任何应用程序中,如果我知道,参数的数量是固定的(比如说2个参数), 但是函数名是可变的(可以是normalise_range/average/我不知道..), 然后我将使用如上所示的def curry2(f):,它将接受接受接受两个参数(固定)的所有函数。

我的问题是:

  1. 我的理解正确吗?
  2. 如果是的话,我们可以考虑用curring来表示变量数函数吗?

Tags: 函数add应用程序参数数量returndefrange
2条回答

函数curring的目的是方便地从更一般的函数中获取专门的函数。您可以通过在不同的时间预先设置一些参数并在之后保持这些参数不变来实现这一目的。

这与命名无关。在Python中,您可以随时轻松地重命名变量/函数。

示例:

def simple_function(a):
    def line(b=0):
        def compute(x):
            return [a+b * xi for xi in x]
        return compute
    return line

x = range(-4, 4, 1)
print('x {}'.format(list(x)))
print('constant {}'.format(simple_function(3)()(x)))
print('line {}'.format(simple_function(3)(-2)(x)))

给予

x [-4, -3, -2, -1, 0, 1, 2, 3]
constant [3, 3, 3, 3, 3, 3, 3, 3]
line [11, 9, 7, 5, 3, 1, -1, -3]

现在还没有那么激动人心。它只将类型为f(a,b,c)的函数调用替换为类型为f(a)(b)(c)的调用,这甚至可能被视为Python中不太优雅的风格。

但它允许你做:

line_through_zero = simple_function(0)
print('line through zero {}'.format(line_through_zero(1)(x))) # only slope and x

它给予

line through zero [-4, -3, -2, -1, 0, 1, 2, 3]

因此,curring的优点是,您可以获得具有固定参数的专用函数,并且可以使用这些函数,而不是编写更通用的表单并在每次调用时设置固定的参数。

咖喱的替代品是:partiallambdadefault parameters。因此,在实践中,咖喱可能是有用的,但你也可以绕过它,如果你想。

另见Currying in Python

咖喱菜至少有两个优点:

1)它保留您的代码(依次是您的思考DRY

假设你有这样一个函数:

def call_me(context, args):
    ...

通过curring,您可以获得该context的一个专门的函数,该函数可以被丢弃等。您不必再次重复上下文。

2)用单个输入函数来思考要比n参数容易得多;尽管有时这是有争议的。

另请参见:What is the difference between currying and partial application?

相关问题 更多 >