Pythonの学習進捗状況13(リターン機能)

戻り値として機能

高次機能に加えて、結果の値の関数が返されたとしても、パラメータの関数として受け付けます。

我々和を達成するための可変パラメータ。典型的には、加算関数は次のように定義されます。

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()の結果がでなければなりません149、実際の結果は次のとおりです。

>>> 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

 

おすすめ

転載: www.cnblogs.com/2205254761qq/p/12315359.html