この概念を理解することは困難クロージャは良いですが、彼らの友人の多くは夢中歩行している、夢中歩行林古いコールドは、この記事を書きたい夢中歩行パートナーにはいくつかの助けになることができます〜
私はあなたが別の関数内で関数を定義する場合、我々は彼を呼び出す外部関数の外で、私たちの内部関数の中に彼を呼んで、見て理解してください。
クロージャー:
外部関数内の関数の定義は、機能および戻り値外の一時変数の使用における機能は、外部の参照機能です。これは、閉鎖を構成しています。
ローカル変数が消え、関数がオーバーであれば一般的には、それらの私たちの知覚に、すべてのものは、内部関数から解放されたメモリに戻りました。しかし、外部関数は、関数の内部でその一時変数の最後に見つかった場合は、特殊なケースであるが、将来的に使用される閉鎖は、一時的な変数は、内部関数にバインドされて入れ、その後、彼自身もう一度を終えました。
非常にああを理解することは困難不明瞭!!^コードの一部で見てみましょう。^
閉鎖機能の例# 2#外側の外部関数及びB関数外部一時的な変数である 3 DEF外部(): 4、B = 10 。5#インナー機能以内 6インナーDEF()。 。7内側#関数外の関数で使用される一時変数 。8プリント(+ B) 。関数の戻り値外9#は、基準の関数で 10内部戻り 11。 12が__name__ある場合==「__main__」: 13は、ここでは、伝達関数を呼び出す外#ありますパラメータ5 14#外側ケースは、一時5 bが10である二つの変数の関数であり、関数は、関数が格納されているデモを参照戻り、作成され た内部機能が#を見つけ使用する関数15の外端を彼らの一時的な変数に、これら2つの変数が一時的に解除されません、我々は内部関数にバインドされる 16デモ=表地(5) 17#我々は内部関数を呼び出して、内部の機能を見てみましょう一時的に外部関数を使用することができません変数 18の#を実装する関数の戻り値、すなわち参照インナー機能、機能等価外側本明細書内格納されているデモ 。19デモ()15# 20は 21(7)=外DEMO2ある 22(DEMO2ある)。17#
上記の例から私は、単純な、典型的な閉鎖を書いています。私は〜それは初心者のジュニアパートナーである場合は、おそらく多くの名詞は、その手段が、それは問題で、私が説明するための独自の理解に応じてこれらの用語を入れていないのか理解していないと思います
外部関数は、関数への参照を返します。
何の言及されていますか?すべてが1つの整数データ、関数などのPythonにおけるオブジェクトは、実際には、対象となっています。
実際にそれらのメモリ内のメモリ位置預金を参照して値を1、変数名を格納する場所があるとき、私たちは、= 1を実施した場合。ちょうどポインタのようなC言語リファレンス、我々はアドレスへの参照を理解することができます。変数は名前だけ、基準値であり、この番号1は、1を保存したアドレスである預金です。
Pythonで同じトークン、我々はデフデモ関数を定義():それらのメモリは、内側にその一部の機能コードを保存することができた空間、ローカル変数、およびを開きます。このデモでは、機能だけの場所への参照を保持だけで、変数名、です。我々はx =デモは、Y =デモは、この操作は同等ですまた、デモをx物事を保つために割り当てられていたことができますとy、xとyは、我々が使用することができた後どこデモ機能、このような基準点です実際に呼ばれる当社独自のデモを作成するためのX()またはy()()の呼び出しは、単に機能、X、Yおよびデモは、3人の可変名を保存した同じ機能を参照してください。
あなたは非常にあいまいに理解していない場合、私は知らない、私は私が表現したいことを理解してほしいです。
上記の説明では、我々は参照関数にバックがどのように物語である、と言って続けることができます。閉鎖のため、外側の外側の機能我々はデモ=外側(コール最後リターン内側、外側の関数)内の基準関数であり、内側外側を返した場合、この基準は、デモに格納されています。次回私たちはデモ()、内部機能を実行するのと同じでしょう。
私たちは、関数名の後の括弧のペアが続く場合は、機能を発見したと同等になりました私は、関数の参照位置を保持され、括弧が続いていない場合は、名前の同等のはただの関数で、この関数をコールするつもりです。
内部機能に結合する機能外2つの一時的な変数:
私たちの通常の認知によると、時間の関数を終了、変数が存在しない後に一時的な変数は、メモリに解放させるために。通常の状況下では、確かにケースです。しかし、クロージャは特殊なケースです。外部関数は、同時に、自分自身の終わりに、彼らの一時的な変数は、将来の内部関数で使用される機能へのバックを発見し、外部への一時的な変数は、一緒にバインドする関数内で機能します。関数の外には終わったので、関数内で呼び出すときにはまだ機能の外に一時変数を使用することができます。
私が書かれている例では、Iは、それぞれ、入力値が5,7であり、外側の外部関数への2つのコールを有します。内部関数は一度だけ定義され、我々は同じではありませんあなたが呼び出すときに、内部関数は、関数の外に一時的な変数を認識することであることがわかりました。我々は一度だけ定義されて機能してもPythonは、すべてのものは、オブジェクトですが、時間は関数が実際にコードの内部や機能を作成する際に外部の機能に応じて実行される外に、我々は外側の関数を呼び出すたびに、それが作成されます実行されていますコードは同じであるが、それは、異なるオブジェクトを作成し、関数内の一時変数に各入力値を結合することが関数内で、この関数内の参照を返します。機能コード内部の間には同じですが、実際には、我々は外部の関数を呼び出すたびにオブジェクト参照の別のインスタンスを返し、その機能は同じですが、彼らは実際には同じ関数オブジェクトではありません。
外側の閉鎖機能変更機能ローカル変数:
関数クロージャでは、我々は一時的な変数にバインドする機能の外に自由に使用できますが、我々は時間の関数外で一時変数の値を変更したい場合は、問題を見つけました!編集者注ピンチ??!!(泣きました)
パイソンの基本的な構文のうち、関数はグローバルデータなしで読み出すことができるが、グローバルデータを変更するために二つの方法がある場合:1つのグローバルグローバル変数の宣言は、グローバル変数は、2データを修正することができる可変型であります
クロージャは似たような状況の中で機能します。私たちは、内閉鎖変数(外部関数のローカル変数関数へのバインド)に機能を変更したい場合は次のとおりです。
1つのpython3、あなたは変数が変数、ローカル変数のスペースではないことを示し、我々は変数空間変数の層をルックアップする必要がある、変数を宣言するために非ローカルキーワードを使用することができます。
2 python2、ノーローカル以外のキーワードを、私たちはこのようなリストとして変数の型クロージャ変数データの変更を、変更することができます。
コード!!!
可変クロージャの#1の変形例 2つの#外側の外部関数およびBは、一時的な関数外部変数で 3 DEF外部()。 。及びbは4、B = 10#クロージャ変数 5 C = [] #ここで修飾された閉鎖可変方法2に相当する 関数内の内側#6。 7 DEF内(): 8つの#修飾閉鎖変数のような機能 9の方法#1非ローカルキーワードステートメント 10非ローカルB 。11 B + = 1 12#方法であります第二、クロージャ変数は、変数のデータ・タイプを変更し、このようなリスト 13は、C [0] +。1 = 14プリント(C [0]) 15プリント(B) 16#外部関数が返す関数の値を参照し 、内側17リターン 18れる 19 __name__ == '__main__' IF: 20である、 (5)21と、アウターデモ=で 22デモ(ある)6. 11#。
上記のコードから、我々はクロージャ変数が変更されたために、結果が実際に改正後の結果でプリントアウトし、それぞれの機能を含め、それを見ることができます。上記二つの方法は、閉鎖変数の関数を修正する方法です。
ノートへのもう一つのポイント:関数内の各呼び出し、実行の終焉後にオンになっている機能が、クロージャ変数の実際に一つだけのコピーが、関数内で参照に戻った後、外部関数が呼び出された後に使用閉鎖プロセス、あなたはクロージャ変数の使用で同じ関数内で開くたびに
コード!
1 #coding:UTF8 2 DEF外側(X): 3 DEF内側(Y): 4非局所X 5、X + Y = 6戻りX インナー7戻り 8 9 10の外側(10)= 11印刷((1))/ / 11 12プリント((3))// 14
クロージャ変数は、実際には同じものを使用したXときに、2つの各内側コールこと11及び図14をプリントアウトしました。
クロージャは薄暗く??!!
多くのパートナーはああ閉鎖薄暗い、混乱していますか??理解しておくこともとても難しいです!
3.1デコレータ!!!デコレータは何をしているのですか??一つのアプリケーションは、我々は、我々はログインモジュールを飾ることができ、この機能は、それがかかった時間の統計を実行したい場合は、ログイン機能を書くために働くということです、デコレータは、私たちはデコレータとの時間を取るために、実行前と後のログイン機能を完了できます。
3.2オブジェクト指向!!!上記の分析を経験し、私たちは与えられた関数内で外側の関数の一時的な変数を見つけました。私たちは、オブジェクトのクラスのうち作成したクラスは、同じ属性のメソッドを持って作成するように、クラスオブジェクトの場合は、オブジェクトは、同様の属性とメソッドをたくさん持っている思い出します。クロージャはまた、一つのオブジェクト指向のアプローチを実現します。私たちは、このようなavaScriptに他のプログラミング言語で、それらを使用していませんが、このPythonでは、クロージャは、多くの場合、オブジェクト指向プログラミングを達成するために使用されています
シングルモードの例3.3!!実際には、これはデコレータのアプリケーションです。シングルトンは、すべての後に、比較的背の高い、必要が最終的にSingletonパターンは、我々が調査していないだろう、とやっている理解するためにいくつかのプロジェクト経験を持っています。
自分の理解を解いた後、閉鎖の学習時に遭遇した私の問題について話しています。私は、ヘルプの初心者の友人にしたいです。偉大な神はまた、批判や通信に他のパートナーを歓迎します -