Pythonのクロージャとは何ですか?アプリケーションには何がありますか?
この記事の内容は、Python におけるクロージャとは何ですか?アプリケーションには何がありますか?一定の参考値があるので、困っている友達は参考にしていただければ幸いです。
1. 戻り値としての関数
「クロージャ」を導入する前に、まず戻り値としての関数の状況を理解しましょう。
関数をパラメーターとして受け取るだけでなく、高階関数は関数を結果値として返すこともできます。例えば、先ほど紹介したデコレータでは戻り値として関数を使用しています。
2. 閉鎖
1. 閉鎖の条件と影響
閉鎖とは何ですか?
関数内に別の関数をネストする場合、内側の関数が外側の関数の変数を参照すると、クロージャが発生する可能性があります。
Soクロージャ生成の 3 つの条件 (1 つは必須):
1. 内部関数はネストされている必要があります
2. 内部関数は外部関数の変数を参照する必要があります
3. 外部関数は外部関数の変数を参照する必要があります内部関数を返す
それでは、なぜクロージャを試す必要があるのでしょうか、またその機能は何でしょうか?
1. クロージャは、外部関数のローカル変数に基づいて異なる結果を取得できます。
2. クロージャが実行されると、現在の実行環境は維持でき、実行結果は関数の最後の実行結果に依存します
2. クロージャーの例
栗 1 : シーケンスの合計を求めます>>> 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
# 但是调用 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
説明: f1 と f2 の戻り関数の位置が異なるため、f1==f2 の戻り結果は False になります。 ただし、最終的な実行結果には影響せず、f1()とf2()の実行結果はどちらも25であり、同じ領域を指すid()で確認できます。 栗 2:
def count(): fs = [] for i in range(1, 4): def f(): # 返回函数f()放在循环里 return i*i fs.append(f) return fs f1, f2, f3 = count()
実際の実行結果は次のとおりです: f1=9 f2=9 f3=9
実際に考えていたものとは少し異なるかもしれません ([1,4 ,9]) 。 f()関数はforループの中に配置されているため、ループ終了時のみ最終的にi=3の実行結果9が返されます。 したがって、return 関数は、ループ変数や、後で変更される可能性のある量を参照しないことが最善です。では、どのように変更すればよいのでしょうか?
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
3. 匿名関数 lambda
構文: ラムダパラメータ: 式
注意 : 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法
