什么时候应该在 Python 中使用函数柯里化? [英] When should I use function currying in Python?

查看:27
本文介绍了什么时候应该在 Python 中使用函数柯里化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When should I write my functions in curried form? does not match my thought, need to correct myself.

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

As part of my learning link, this is what I understand from function currying. Below is one example:

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).

In any application, if I know that the number of arguments are fixed (say 2 arguments) and function name is normalise_range(say), then I will define def normalise_range(x, y): function and use it in my application directly by calling normalise_range(x, y).

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

In any application, if I know that, the number of arguments are fixed (say 2 arguments), but the function name is varying (can be normalise_range/average/I don't know..), then I will use def curry2(f): as shown above, which will accept all functions that take two arguments (fixed).

我的问题:

  1. 我的理解是否正确?
  2. 如果是,我们可以考虑对可变数量参数的函数进行柯里化吗?

推荐答案

函数柯里化的目的是方便地从更通用的函数中获取专门的函数.你可以通过在不同的时间并在之后保持固定.

The purpose of function currying is to easily get specialized functions from more general functions. You achieve this by pre-setting some parameters at a different time and keeping them fixed afterwards.

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

It has nothing to do with the naming. In Python you can rename a variable/function easily at all times.

示例:

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 中不太优雅的风格.

Now this was not yet that exciting. It only replaced functions calls of type f(a,b,c) with calls of type f(a)(b)(c) which might even be seen as the less elegant style in 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]

因此,柯里化的优势在于您可以获得具有固定参数的专用函数,并且可以使用这些函数而不是编写更通用的形式并在每次调用时设置固定参数.

So the advantage of currying is that you get specialized functions that have fixed parameters and can be used instead of writing the more general form and setting the parameters fixed at each single call.

柯里化的替代方法是:partiallambda默认参数.所以在实践中柯里化可能很有用,但如果你愿意,你也可以绕过它.

Alternatives to currying are: partial, lambda and default parameters. So in practice currying might be useful but you can also get around it if you want.

另见在 Python 中柯里化

这篇关于什么时候应该在 Python 中使用函数柯里化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆