2014-03-30 511 views
-4

所期望的是,以在python製作加法累加器

def accumulator(): 
     def addition(): 
      something here 
      and others 
     return addition 
使用消息傳遞,使得每個累加器()將具有在端部整體總和

其中

A = accumulator() 

A(10) 
10 
A(10) 
20 

我不知道如何開始。 。 。如果你能幫上忙,我會非常感激! 謝謝

+0

你使用什麼版本:Python 2或Python 3?如果你使用Python 3,你可以通過關閉來完成。 – HYRY

+0

@HYRY我使用Python 3 – user3251511

+2

你能編輯你的問題並完成你的句子嗎? 「使用消息傳遞」,從什麼?你在你的例子中使用這個函數就像一個對象,你是否需要寫一個對象Accumulator? –

回答

2

只是另一個變種,封閉。

def accumulator(): 
    sum = 0 
    def addition(n): 
     nonlocal sum 
     sum += n 
     return sum 
    return addition 
+0

只是想知道,但爲什麼我不能只使用沒有「非本地」的總和? – user3251511

2

不知道這是你問的問題,但你可以通過更新一個類變量來獲得所需的效果。

class accumulator(object): 
    summation = 0 
    def __call__(self,val): 
     accumulator.summation+=val 
     print accumulator.summation 

A = accumulator() 
A(10) 
A(10) 
B = accumulator() 
B(10) 
B(100) 

這將給:

10 
20 
30 
130 

和每一個實例將在summation屬性的正確值。

如果你想保留的A求和和B分開:

class accumulator(object): 
    def __init__(self): 
     self.summation = 0 
    def __call__(self,val): 
     self.summation+=val 
     print self.summation 
+0

但是如果我想使A和B的總和分開? – user3251511

+0

我爲這個案例的答案增加了一些額外的代碼。 – ebarr

+0

非常感謝您的幫助! – user3251511

2

你可以定義一個協程,爲Aशwiniचhaudhary建議:

def coroutine(func): 
    """ 
    http://www.python.org/dev/peps/pep-0342/ 
    http://www.dabeaz.com/coroutines/index.html 
    """ 
    def wrapper(*args, **kw): 
     gen = func(*args, **kw) 
     gen.send(None) 
     return gen 
    return wrapper 

@coroutine 
def accumulator(): 
    val = 0 
    while True: 
     val += (yield val) 

可以使用這樣的:

A = accumulator().send 
print(A(10)) 
# 10 

print(A(10)) 
# 20 

print(A(10)) 
# 30