クロージャー1.はじめに
クロージャパッケージ定義:
内部関数を返す入れ子関数、外部関数の変数を使用して、内部機能、および外部関数の前提の下で、我々はこの機能を使用する外部関数は、内部変数の閉鎖と呼ばれています。
2.閉鎖構成条件
クロージャを定義することにより、我々は閉鎖状態を形成することがわかります。
- ネストされた関数(この関数を定義関数)の前提の下で
- 内部機能は、(パラメータが、外部機能を含む)外部変数の関数を使用します
- 外部関数は内部関数を返します。
3.サンプルコードの単純な閉鎖
#外部関数定義 DEFのfunc_out(NUM1を): #は、内部関数定義 DEFのfunc_inner(NUM2): #変数、外部関数(NUM1)を使用して内部関数を 結果= NUM1 + NUM2 印刷(" 結果:" 、結果) #外部関数は、関数が内部閉鎖の復帰である内部機能、戻り 戻りfunc_innerを #インスタンス閉鎖作成 = Fのfunc_outを(1 ) #は閉鎖実行 F(2 ) F( 3)
結果:
結果:3
結果: 4
閉鎖命令の結果:
以上の結果により、外部変数関数NUM1に格納されたクロージャの出力は、各時間クロージャがNUM1 = 1に基づいて算出されていることがわかります。
4.閉鎖効果
- クロージャはない外部関数呼び出しと完全に破壊として、外部変数関数の中で保存することができます。
注意点:
- 外部関数のクロージャは、変数を参照するので、変数は、外部関数のメモリ消費量が解放されません。
5.まとめ
- 内部関数のリターンを使用する場合、外部変数クロージャの機能が形成されています
- 閉鎖は、外部変数関数に保存することができます
-
閉鎖その標準:
#外部関数 DEFのTEST1(A): B = 10の #内部機能 DEF TEST2(): #内部変数またはパラメータの関数外部関数用いて プリント(A、B)# は、関数が内部閉鎖例のリターンである内部機能を返し 返す TEST2を
クロージャは使用されています
要件:な対話などさまざまな人々の閉鎖、との対話のための設定情報によると:
ジョー・スミスは?:北京はまだに
ジョン・ドウ:あなたは、と心配する必要は。
#外部関数 DEFのCONFIG_NAME(名): #内部関数 DEF :(情報)say_info 印刷(名+ " :" + 情報) リターンsay_info トム = CONFIG_NAME(" トム" ) トム(" こんにちは!" ) トム(" こんにちは、そこに?" ) ジェリー = CONFIG_NAME(" ジェリー" ) ジェリーは、(「ではない、あなたと一緒に再生されません!」)
結果:
トム:こんにちは!
トム:こんにちは、してください?
ジェリーは:、あなたと再生されないありません!
閉鎖で外部変数を変更します。
#外部関数の定義 DEFのfunc_out(NUM1を): #内部関数の定義 DEFのfunc_inner(NUM2を): #ここでは、外部NUM1の値を変更することを意図し、実際に内部の機能は、ローカル変数NUM1を定義します NUM1 = 10 #内部関数は外部変数の機能を使用しています(NUM1) 結果= + num1をnum2の 印刷(「結果:」、結果) 印刷(NUM1) func_inner( 1 ) プリント(NUM1) #外部関数は、関数が内部クロージャの戻り値である内部機能、返す リターンfunc_innerを #インスタンス閉鎖作成 (1 = Fのfunc_outを) #は閉鎖実行 F(2)
正しく外部変数の閉鎖の使用例を変更:
#外部関数の定義 DEFのfunc_out(NUM1を): #内部関数の定義 DEFのfunc_inner(NUM2を): #をここで意図ローカル変数num1を定義する関数の内部で実際にNUM1の外部値を変更する 非ローカルNUM1の #は、外部変数Aの使用しているここでは、インタプリタを教えて #を外部変数を変更NUM1 NUM1 = 10 #内部関数は外部変数の機能を使用しています(NUM1) 結果= + num1をnum2の 印刷(「結果:」、結果) 印刷(NUM1) func_inner( 1 ) プリント(NUM1) #外部関数は、関数が内部クロージャの戻り値である内部機能、返す リターンfunc_innerを #インスタンス閉鎖作成 (1 = Fのfunc_outを) #は閉鎖実行 F(2)
デコレータの定義
関数は、本質的に閉鎖機能で、余分な機能の既存の機能を高めることです。
それはデコレータています:
- この関数は、既存のソースコードを変更しません
- 既存の関数が呼び出され、変更しないでください
- これは、機能を追加する機能を有しています
サンプルコードのデコレータ
#ログイン認証機能を追加 DEF チェック(FN): DEF インナー(): 印刷(" ログインしてください.... " ) FN() リターンインナー DEF コメント(): 印刷(" コメント" ) #デコレータ関数飾るために コメントを= (コメント)をチェック コメント()
コード説明:
- 閉鎖機能のみつのパラメータは、関数型である必要があり、機能は、このようにデコレータを定義します。
- 書き込みのコードを変更することはできません実装された機能コードを提供するオープンクローズ原理を、従うことが、拡張することができます。
結果:
ログインしてください....
注釈
シンタックスシュガー文言デコレータ
複数の機能は、ログイン認証機能を追加する必要がある場合は、この機能コードFUNC =チェック(FUNC)を記述する必要があるたびに施されており、このような行為は非常に面倒です。
@デコレータ名、シンタックスシュガーはまた、既存の装飾機能に行うことができる方法によって:Pythonはシンタックスシュガーは、砂糖の文法書き込みフォーマットがあるシンプルな言葉遣いに装飾的な機能を提供し、
#ログイン認証機能追加 DEF チェック(FN): 印刷(「デコレータ機能が実行」) DEF インナー(): 印刷(「ログインしてください.... 」) FN() リターンインナー #飾る関数にシンタックスシュガーの方法 @Check DEF コメント(): 印刷(「コメント」) コメント()
説明:
- コメント=チェック(コメント)に相当@Check
- デコレーターの実行時間は、直ちに時にロードモジュールを実行します。
結果:
ログインしてください....
注釈
使用デコレータ
- 関数の実行時間の統計情報
- 出力ログ情報
デコレータは、統計関数の実行時間を達成しています
インポート時 #デコレータ機能 DEF GET_TIME(FUNC): DEF インナー(): 開始 = time.time() FUNC() 終了 = time.time() 印刷(「関数実行がF%とる」%を(エンド開始)) を返すインナー @時間をもらう DEF :関数func1() のための I における範囲(100000 ): プリント(I) 関数func1()
結果:
... 99995 99996 99997 99998 99999 機能を実行0過ごす 329 066を