関数を書くmake_monitoredは入力として関数fをとり、それ自身が1つの入力を取ります。 make_monitoredによって返される結果は、内部カウンタを維持することによって呼び出された回数を追跡する第3の関数、たとえばmfです。他の関数を監視して数える関数Python
mfへの入力が特殊文字列「how-many-calls?」の場合、mfは カウンタの値を返します。
入力が特殊文字列 "reset-count"の場合、mfはカウンタ をゼロにリセットします。他の入力の場合、mfはその入力でfを呼び出した結果を返し、 はカウンタをインクリメントします。ここ
def make_monitored(f):
a=[0]
def mf(x):
if x=="how-many-calls?":
return a[0]
elif x=="reset-count":
a=[0]
else:
a[0]+=1
return f(x)
return mf
def double(x): #NOT TO BE CHANGED , provided by question
return 2 * x
d = make_monitored(double) #NOT TO BE CHANGED, provided by question
は私が理解しないものです: 私は内部カウンタとして作るために1つの要素のリストを作りたいです。私は、make_monitorsが親関数で、私が定義したときにaが定義されていないと言う理由を知りません。
これは私がこれまでに(そして正しく)似た方法を使って完成したが、成功したもう一つの質問です。
アキュムレータは、単一の数値引数 で繰り返し呼び出され、その引数を合計に累積する関数です。呼び出されるたびに、現在集計された合計 を返します。 アキュムレータを生成するmake_accumulator関数を記述します。各関数は独立した合計を保持します。
def make_accumulator():
lst=[0]
def add(x):
lst[0]+=x
return lst[0]
return add
A=make_accumulator()
サンプルの実行:
A = make_accumulator()
A(10)出力:10
A(10)出力:20
私はなぜ取得いけませんlst [0]はここで定義されています。 のみ可能な理由は、make_accumulatorパラメータなしで取りますが、割り当てa = [0]
がmf
にローカルな新しいa
を作成します。1.
おかげで、のpython 3.6を使用してそれを – Silver