gpt4 book ai didi

Python 柯里化(Currying)任意数量的变量

转载 作者:行者123 更新时间:2023-12-02 02:48:43 26 4
gpt4 key购买 nike

我正在尝试使用柯里化(Currying)在 Python 中进行简单的函数添加。我找到了这个 curry 装饰器here .

def curry(func):     
def curried(*args, **kwargs):
if len(args) + len(kwargs) >= func.__code__.co_argcount:
return func(*args, **kwargs)
return (lambda *args2, **kwargs2:
curried(*(args + args2), **dict(kwargs, **kwargs2)))
return curried

@curry
def foo(a, b, c):
return a + b + c

现在这很棒,因为我可以做一些简单的柯里化(Currying):

>>> foo(1)(2, 3)
6
>>> foo(1)(2)(3)
6

但这仅适用于三个变量。如何编写函数 foo 以便它可以接受任意数量的变量并且仍然能够柯里化(Currying)结果?我尝试过使用 *args 的简单解决方案,但它不起作用。

编辑:我已经查看了答案,但仍然无法弄清楚如何编写一个可以执行如下所示的函数:

>>> foo(1)(2, 3)
6
>>> foo(1)(2)(3)
6
>>> foo(1)(2)
3
>>> foo(1)(2)(3)(4)
10

最佳答案

可以说,显式优于隐式:

from functools import partial

def example(*args):
print("This is an example function that was passed:", args)

one_bound = partial(example, 1)
two_bound = partial(one_bound, 2)
two_bound(3)

@JohnKugelman 解释了您想要做的设计问题 - 对柯里化(Currying)函数的调用在“添加更多柯里化(Currying)参数”和“调用逻辑”之间会不明确。这在 Haskell 中不是问题(该概念的来源),原因是该语言会惰性地计算所有内容,因此没有区别,您可以有意义地做出区分介于“一个名为 x 的函数,不接受任何参数并仅返回 3”和“对上述函数的调用”之间,甚至介于它们和“整数 3”之间。 Python 不是这样的。 (例如,您可以使用零参数调用来表示“立即调用逻辑”;但这会破坏特殊情况不够特殊,并且需要一对额外的括号来实现简单您实际上不想进行任何柯里化(Currying)的情况。)

functools.partial 是 Python 中函数部分应用的开箱即用解决方案。不幸的是,重复调用 partial 来添加更多“柯里化(Currying)”参数的效率并不高(底层会有嵌套的 partial 对象)。然而,它更加灵活;特别是,您可以将它与没有任何特殊装饰的现有函数一起使用。

关于Python 柯里化(Currying)任意数量的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com