2016-07-22 31 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