什么时候应该使用函数柯里化?

新手上路,请多包涵

我什么时候应该用柯里化形式编写我的函数? 不符合我的想法,需要纠正自己。

作为我学习 链接 的一部分,这是我从函数柯里化中了解到的。下面是一个例子:

 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. 如果是,我们可以考虑柯里化参数个数可变的函数吗?

原文由 overexchange 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 335
1 个回答

函数柯里化的目的是轻松地从更通用的函数中获取专用函数。 您可以通过在不同的时间预先设置一些参数并在之后保持它们固定来实现这一点。

它与命名无关。在 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]

所以 currying 的优点是您可以获得具有固定参数的专用函数,并且可以使用它来代替编写更通用的形式并在每次调用时设置固定的参数。

柯里化的替代方法是: partiallambdadefault parameters 。所以在实践中柯里化可能很有用,但如果你愿意,你也可以绕过它。

另见 Python 中的柯里化

原文由 Trilarion 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题