gpt4 book ai didi

python - Python中的函数链

转载 作者:IT老高 更新时间:2023-10-28 21:11:50 25 4
gpt4 key购买 nike

开启 Codewars.com我遇到了以下任务:

Create a function add that adds numbers together when called in succession. So add(1) should return 1, add(1)(2) should return 1+2, ...

虽然我熟悉 Python 的基础知识,但我从未遇到过能够连续调用的函数,即可以调用的函数 f(x) f(x)(y)(z)...。到目前为止,我什至不确定如何解释这个符号。

作为一名数学家,我怀疑 f(x)(y) 是一个函数,它为每个 x 分配一个函数 g_{x} 然后返回 g_{x}(y)f(x)(y)(z)

如果这种解释是正确的,Python 将允许我动态创建对我来说非常有趣的函数。在过去的一个小时里,我在网上搜索了一个小时,但无法找到正确方向的线索。不过,由于我不知道这个编程概念是如何被调用的,所以这可能不会太令人惊讶。

你如何称呼这个概念,我在哪里可以阅读更多关于它的信息?

最佳答案

我不知道这是否是 function 链接和 callable 链接一样多,但是,由于函数 are 是可调用的,我猜有没有造成伤害。无论哪种方式,我都可以想到两种方法:

子类化int并定义__call__:

第一种方法是使用定义 __call__ 的自定义 int 子类。它返回一个具有更新值的新实例:

class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)

add 函数现在可以定义为返回一个 CustomInt 实例,该实例作为返回自身更新值的可调用对象,可以连续调用:

>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44) # and so on..
50

另外,作为一个int子类,返回值保留了int__repr____str__行为s。 但对于更复杂的操作,您应该适本地定义其他 dunders

正如@Caridorc 在评论中指出的那样,add 也可以简单地写成:

add = CustomInt 

将类重命名为 add 而不是 CustomInt 也可以类似地工作。


定义一个闭包,需要额外调用 yield 值:

我能想到的唯一其他方法涉及一个嵌套函数,该函数需要一个额外的空参数调用才能返回结果。我使用 nonlocal 并选择将属性附加到函数对象以使其在 Python 之间可移植:

def add(v):
def _inner_adder(val=None):
"""
if val is None we return _inner_adder.v
else we increment and return ourselves
"""
if val is None:
return _inner_adder.v
_inner_adder.v += val
return _inner_adder
_inner_adder.v = v # save value
return _inner_adder

这会不断返回自身 (_inner_adder),如果提供了 val,则将其递增 (_inner_adder += val),否则, 按原样返回值。就像我提到的,它需要一个额外的 () 调用才能返回递增的值:

>>> add(1)(2)()
3
>>> add(1)(2)(3)() # and so on..
6

关于python - Python中的函数链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038358/

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