我应该在什么时候使用CURYING函数呢? [英] When should I use function currying?

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

问题描述

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

作为我学习的一部分link,这是我从函数汇聚中了解到的。下面是一个示例:

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. 如果是,是否可以考虑使用参数数目可变的函数?

推荐答案

函数汇聚的目的是从更一般的函数中轻松获取专用函数。您可以通过在不同的时间预先设置某些参数并在以后保持其固定来实现此目的。

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

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

可以选择:partiallambdadefault parameters。因此,在实践中,仓促可能是有用的,但如果您愿意,您也可以绕过它。

另请参阅Currying in Python

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

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