戻り値として機能
高次機能に加えて、結果の値の関数が返されたとしても、パラメータの関数として受け付けます。
我々和を達成するための可変パラメータ。典型的には、加算関数は次のように定義されます。
def calc_sum(*args):
ax = 0 for n in args: ax = ax + n return ax
合計がすぐに必要とされていない場合は、しかし、以降のコードでは、必要に応じて、再び行う方法を計算しますか?合計は、結果を返しますが、関数の総和を返さないことがあります。
def lazy_sum(*args):
def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
私たちが呼び出すとlazy_sum()
、リターンは、和の結果ではなく、加算機能:
>>> f = lazy_sum(1, 3, 5, 7, 9) >>> f <function lazy_sum.<locals>.sum at 0x101c6ed90>
関数を呼び出しf
た結果の場合にのみ、実際の合計:
>>> f()
25
この例では、関数の中でlazy_sum
、彼はまた、関数を定義sum
し、内部関数がsum
外部関数参照することができlazy_sum
たときに、引数とローカル変数をlazy_sum
関数が戻るがsum
、「これが呼ばれ、パラメータや変数は関数が戻るに格納されていますクロージャ(閉鎖)「プログラム構造は、大きな力を持っています。
私たちが呼ぶときますのでご注意くださいlazy_sum()
同じパラメータを渡された場合でも、呼び出しは、たびに新しい関数を返します。
>>> f1 = lazy_sum(1, 3, 5, 7, 9) >>> f2 = lazy_sum(1, 3, 5, 7, 9) >>> f1==f2 False
f1()
そして、f2()
互いに独立してコールの結果。
クロージャ
機能に注目すると、ローカル変数の定義内の参照を返すargs
ので、関数は関数を返すとき、こと、関数参照内のそのローカル変数は、それゆえ、一緒に簡単なクロージャと、それを達成することは容易ではない、また、新しいです。
ノートへのもう一つの問題は、関数のリターンがすぐに実行されていないということですが、コールをするまでf()
実行されました。例で見てみましょう:
def count():
fs = []
for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
上記の例では、各サイクルは三つの機能が返され、作成、新たな機能を作成します。
あなたは、その呼び出しを考えるかもしれないf1()
、f2()
とf3()
の結果がでなければなりません1
、4
、9
、実際の結果は次のとおりです。
>>> f1()
9
>>> f2()
9
>>> f3() 9
すべてがあります9
!その理由は、関数は、変数への参照を返すことであるi
が、それは直ちに実行されません。三つの機能が戻る頃には、それらが参照先の変数にはi
なってきた3
ので、最終的な結果です9
。
あなたはどのように行うにループ変数を参照する必要がありますか?もう一つの方法は、関数のループ変数パラメータの現在の値をバインドする関数を作成することで、関係なく、ループ変数のフォローアップを変更する方法の、変わらない関数パラメータの値にバインドされています。
def count():
def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
結果を見てください:
。
オリジナルURLます。https://www.liaoxuefeng.com/wiki/1016959663602400/1017434209254976#0