普通は関数のクラスを使いますが、
Python で 累積機を生成する関数は以下のように書けます。
変数を入れ子のスコープ内で渡すためには配列を利用する必要があります。
これは、通常のオブジェクトが値渡しなのに対し、配列が参照渡しされるためです。
トリッキーなのと、かえってめんどくさいのであまりお勧めしません。
[ac.py]
01: #! /usr/bin/env python 02: 03: def genac(n): 04: 05: m=[n] 06: 07: def aux(i): 08: m[0]+=i 09: return m[0] 10: 11: return aux 12: 13: if __name__=='__main__': 14: foo=genac(10) 15: print 'foo=genac(10) # making an accumulator whose initial value is 10' 16: baz=genac(100) 17: print 'baz=genac(100) # making an accumulator whose initial value is 100' 18: print 'foo(3) = ', foo(3) # 13 19: print 'baz(1) = ', baz(1) # 101 20: print 'foo(5) = ', foo(5) # 18 21: print 'baz(2) = ', baz(2) # 103
$python ac.py foo=genac(10) # making an accumulator whose initial value is 10 baz=genac(100) # making an accumulator whose initial value is 100 foo(3) = 13 baz(1) = 101 foo(5) = 18 baz(2) = 103