ホームページ >バックエンド開発 >Python チュートリアル >Pythonのクロージャとは何ですか?アプリケーションには何がありますか?
この記事の内容は、Python におけるクロージャとは何ですか?アプリケーションには何がありますか?一定の参考値があるので、困っている友達は参考にしていただければ幸いです。
「クロージャ」を導入する前に、まず戻り値としての関数の状況を理解しましょう。
関数をパラメーターとして受け取るだけでなく、高階関数は関数を結果値として返すこともできます。例えば、先ほど紹介したデコレータでは戻り値として関数を使用しています。
閉鎖とは何ですか?
関数内に別の関数をネストする場合、内側の関数が外側の関数の変数を参照すると、クロージャが発生する可能性があります。
Soクロージャ生成の 3 つの条件 (1 つは必須):
1. 内部関数はネストされている必要があります
2. 内部関数は外部関数の変数を参照する必要があります
3. 外部関数は外部関数の変数を参照する必要があります内部関数を返す
それでは、なぜクロージャを試す必要があるのでしょうか、またその機能は何でしょうか?
1. クロージャは、外部関数のローカル変数に基づいて異なる結果を取得できます。
2. クロージャが実行されると、現在の実行環境は維持でき、実行結果は関数の最後の実行結果に依存します
>>> def calc_sum(*args): ... ax = 0 ... for n in args: ... ax = ax + n ... return ax # 返回变量 ... >>> calc_sum(1,2,3) 6
>>>def lazy_sum(*args): ... def sum(): # sum()是内部函数,可以利用外部函数的参数 ... ax = 0 ... for n in args: # sum()中使用外部函数的局部变量 ... ax = ax + n ... return ax ... return sum # 形成闭包,此时,*args保存在返回的函数中 ... >>>f = lazy_sum(1,3,5,7,9) >>>f # 此时返回的是求和函数 >>> f() # 调用函数f()时,才真正计算求和的结果 25注: f を実行するときの、lazy_sum() 関数の内部実行シーケンス。 run return sum では、*args が return 関数に格納され、返されるのは sum() 関数です。 f() を実行すると、sum() を実行するのと同じになり、*args が含まれます。 lazy_sun() を呼び出すと、毎回新しい関数が返されますが、同じパラメータを渡しても、f() 呼び出しの結果には影響しません。 2 番目の点を確認してみましょう:
# 但是调用 f1() 与f2()的调用结果互不影响 >>> f1 = lazy_sum(1,3,5,7,9) >>> f2 = lazy_sum(1,3,5,7,9) >>> f1 <function lazy_sum.<locals>.sum at 0x013DD618> >>> f2 <function lazy_sum.<locals>.sum at 0x02F92DF8> >>> f1 == f2 False >>> f1() == f2() True >>> f1() 25 >>> f2() 25 >>> id(f1()) 1627215984 >>> id(f2()) 1627215984
def count(): fs = [] for i in range(1, 4): def f(): # 返回函数f()放在循环里 return i*i fs.append(f) return fs f1, f2, f3 = count()
def count(): def f(j): def g(): return j*j # 形成闭包 return g fs = [] for i in range(1, 4): fs.append(f(i)) # 一个i值进入后,f(i)立刻被执行,并加入到fs中 return fs f1, f2, f3 = count() # 返回函数g没有引用j最終結果: [1,4,9] つまり、f1=1 f2=4 f3=
構文: ラムダパラメータ: 式
注意 : 1. ラムダ関数は任意の数のパラメータを受け取り、単一の式の値を返すことができます;
利点: 1. 関数を定義するプロセスが省略され、コードが合理化されます;
>>> list( map( lambda x: x*x ,[1,2,3] ) ) [1, 4, 9]
ここで、
lamdba x : x*x は次のように実装します:
def f(x): return x*x 関数。 >>> f = lambda x:x*x >>> f(5) # 调用 >>> g = lambda x,y=2 : x*y >>> g(2,4) 8 >>> g(2) # 默认y=2 4
return lambda x:x*x
以上がPythonのクロージャとは何ですか?アプリケーションには何がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。