2016-07-22 30 views
-4
add(5)(10)(20) 

如何提供任意数量的括号来添加数字?如何从用户的任意数目的括号添加功能

+3

为什么不'总和([5,10,20])'? – 2016-07-22 07:49:33

+0

为什么不加'(5,10,20)'? (虽然我更喜欢@FullName'sum'选项) – MariusSiuram

+1

也,我怀疑这个问题是有关的[XY问题(http://meta.stackexchange.com/questions/66377/what-is-the-xy - 问题) – MariusSiuram

回答

2

这是不可能的,或者至少它应该如果您使用的语言是值得的任何东西。你正在寻求一种函数来返回两种不同的类型,这就是一场灾难。

  1. 有时它应该返回一个函数,它的下一个号码添加
  2. 其他时候,它应该返回以前输入的总和。

什么?退一步,问自己是什么样的设计。你需要一些方法来通知函数,你完成了输入,现在你需要计算的值。

想想看,函数可能看起来像这样

def add (sum): 
    print(sum) 
    return lambda x: add(sum + x) 

add(1)(3)(4)(5)(10)(20) 

# 1 
# 4 
# 8 
# 13 
# 23 
# 43 
# => None 

但有没有办法让函数知道,除非你改变的API以某种方式返回的最终值。


你可以改变API返回计算值,当用户进入一个0什么的。好主意对吗?非常聪明。

def add (x): 
    def loop(sum, x): 
    if x == 0: 
     return sum 
    else: 
     return lambda x: loop(sum + x, x) 
    return loop(0, x) 

print(add(1)(3)(4)(5)(10)(20)(0)) 
# 42 

嘿,看,它的工作原理@罗林聪明的代码失败。所有没有加入一些花样的一类

print(add(5)(10)(20)(0) + add(5)(10)(20)(0)) 
# 70 

但尽管如此,这是垃圾代码。没有一个设计良好的功能应该像这样。

或者,如果与正在疯狂的内容,建立像@ Rawing的回答表明,一类。

3

你可以创建一个类,像这样:

class add(object): 
    def __init__(self, value): 
     self.value= value 

    def __call__(self, value): 
     self.value+= value 
     return self 

    def __repr__(self): 
     return str(self.value) 


print add(5)(10)(20) 
# output: 35 
+2

我想我完全不感到惊讶,这是可能的蟒蛇。认为有人会依靠它是令人心碎的。 – naomik

+0

这是使用一个火箭筒:D但为什么不? (Fulln名称注释是最简单的,我认为) – pwnsauce

+0

聪明的代码立即抬起了头。 'print add(5)(10)(20)+ add(5)(10)(20)'TypeError:不支持的操作数类型为+:'add'和'add'' – naomik

-1

你可以做的是这样的:

class add(object): 
    def __init__(self, val): 
     self.val= val 

    def __call__(self, val=None): 
     if not val: 
      return self.val 
     self.val += val 
     return self 

add(5)(10)() 
>>> 15