Python_の閉鎖やデコレータ

クロージャー1.はじめに

クロージャパッケージ定義:

内部関数を返す入れ子関数、外部関数の変数を使用して、内部機能、および外部関数の前提の下で、我々はこの機能を使用する外部関数は、内部変数の閉鎖と呼ばれています。

 

2.閉鎖構成条件  

クロージャを定義することにより、我々は閉鎖状態を形成することがわかります。

  1. ネストされた関数(この関数を定義関数)の前提の下で
  2. 内部機能は、(パラメータが、外部機能を含む)外部変数の関数を使用します
  3. 外部関数は内部関数を返します。

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.まとめ

  1. 内部関数のリターンを使用する場合、外部変数クロージャの機能が形成されています
  2. 閉鎖は、外部変数関数に保存することができます
  3. 閉鎖その標準:

 外部関数
 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)

 

デコレータの定義

関数は、本質的に閉鎖機能で、余分な機能の既存の機能を高めることです。

それはデコレータています:

  1. この関数は、既存のソースコードを変更しません
  2. 既存の関数が呼び出され、変更しないでください
  3. これは、機能を追加する機能を有しています

サンプルコードのデコレータ

ログイン認証機能を追加
DEF チェック(FN):
     DEF インナー():
         印刷" ログインしてください.... " 
        FN()
    リターンインナー


DEF コメント():
     印刷" コメント" 

デコレータ関数飾るために 
コメントを= (コメント)をチェック
コメント()

コード説明:

  • 閉鎖機能のみつのパラメータは、関数型である必要があり、機能は、このようにデコレータを定義します。
  • 書き込みのコードを変更することはできません実装された機能コードを提供するオープンクローズ原理を、従うことが、拡張することができます。

結果:

ログインしてください....
注釈

シンタックスシュガー文言デコレータ

複数の機能は、ログイン認証機能を追加する必要がある場合は、この機能コードFUNC =チェック(FUNC)を記述する必要があるたびに施されており、このような行為は非常に面倒です。

@デコレータ名、シンタックスシュガーはまた、既存の装飾機能に行うことができる方法によって:Pythonはシンタックスシュガーは、砂糖の文法書き込みフォーマットがあるシンプルな言葉遣いに装飾的な機能を提供し、

ログイン認証機能追加
DEF チェック(FN):
     印刷デコレータ機能が実行DEF インナー():
         印刷ログインしてください.... 
        FN()
    リターンインナー

飾る関数にシンタックスシュガーの方法
@Check
 DEF コメント():
     印刷コメント


コメント()

説明:

  • コメント=チェック(コメント)に相当@Check
  • デコレーターの実行時間は、直ちに時にロードモジュールを実行します。

結果:

ログインしてください....
注釈

使用デコレータ

  1. 関数の実行時間の統計情報
  2. 出力ログ情報

デコレータは、統計関数の実行時間を達成しています

インポート

デコレータ機能
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を

 

おすすめ

転載: www.cnblogs.com/tracydzf/p/12433696.html