我是Python的新手,我需要用类似的语法编写函数sum
:
print(sum())
print(sum(1)(2)(3))
print(sum(1)(2)(3)(-4)(-5))
输出为:
0
6
-3
我试图像这样写装饰器:
def sum(a=0):
res = a
def helper(b=0):
nonlocal res
res += b
return res
return helper
但它只对固定数量的 () 有帮助。所以这段代码仅适用于:sum(1)(2)
->3
,不适用于sum()
-><function sum.<locals>.helper at 0x7fca6de44160>
或sum(1)()(3)
->TypeError: 'int' object is not callable
我认为应该有一个带有递归的装饰器,但我不知道如何实现它
这种语法选择对我来说看起来很奇怪 -sum(foo)
的结果应该是数字还是函数?内置sum
只接受一个可迭代对象并返回一个数字,这感觉不那么令人惊讶。
但是,假设您确定确实要创建看起来像整数,像整数一样行走,像整数一样游泳但也可以调用的东西,该语言确实允许您创建它:
class sum(int):
def __call__(self, x=0):
return sum(self + x)
输出如您所指定的那样:
print(sum())
print(sum(1)(2)(3))
print(sum(1)(2)(3)(-4)(-5))
0
6
-3
最后,我找到了解决此任务的方法(仅使用函数):
def sum(x=None):
value = 0
def helper(y=None):
nonlocal value
if y is None:
return value
value += y
return helper
return helper(x)