一般的な面接の質問によるPythonのPythonの閉鎖について話をします

ここでは、多くの場合、いくつかのPythonによると、私たちは通常、閉鎖でPythonに関連した問題について話をするあなたとの質問を参照してください!

トピック:

1.クロージャとは何ですか?パッケージを閉じ、定義されましたか?

2.手書きシンプル閉鎖

ローカル以外のキーワードを使用して3変数のスコープルール?

閉鎖の4.アプリケーション

一般的な面接の質問によるPythonのPythonの閉鎖について話をします

 

回答のポイント:

1.まず、変数のスコープを理解する必要があります

例#
DEFのTEST1(A):
プリント(A)
プリント(B)所定のステップ時間を実行することができる機能#。
#1 NameError:グローバル名'B'が定義されていない
TEST1(1)
例示的な2件の
。B = 6
DEFのTEST2(A):
プリント(A)
プリント(B)
TEST2#1。6(1)。
例三
のB = 6。
DEF Test3は(A):
プリント(A)
関数実行#がまだこの点に与えられるプリント(B)
#1 UnboundLocalError:ローカル変数'B'の前に割り当て参照
。B#1 = 9つ以上の例示的なライン割り当て
TEST3(1)

ローカル変数が再び使用されますと似たような状況ではなく、Javaでエラーが、外部のグローバル変数を参照すると、内部的に再割り当てている場合だろう、例えば3の結果はもっと驚くだろう、Javaなど他の言語を学びました値。その機能をコンパイルするときの状況は、Pythonで同じではありません、あなたはBを印刷するときに、それはローカル変数bを照会するために行くだろう、bがローカル変数であると判断され、操作bの割り当てを持っていることが判明した、私たちは、何の割り当てを認めませんでしたそれが例外をスローします。

この説明では「流暢パイソン」を参照します。

これは欠陥ではなく、設計上の選択:Pythonは変数を宣言する必要はありませんが、それは体の変数はローカルです関数定義での割り当てを想定しています。これでは、JavaScriptの動作よりもはるかに優れている、JavaScriptは変数を宣言する必要はありませんが、あなたは(VARを使用して)ローカル変数として変数を宣言することを忘れた場合、知識内のローカル変数の完全なことがあります。

上側の言葉を初めて目にはかなり、それは、この変数はローカル変数であることを証明している変数への代入がある場合、実際には単に、Pythonのは、そう、それは関数本体を信じているように設計されて、理解していない可能性があり、それは唯一の意志ローカル変数からデータを読み出します。このような設計は、いくつかの誤ったデータにつながる、グローバル変数の値を取得するには、知らなくても、私たちを避けることができます。

解決策として、グローバル変数の私達の使用を説明するために、グローバルなキーワードを使用することです。例としては、次のとおりです:

B = 6 
デフTEST4(A):
プリント(A)
グローバルB#1
プリント(b)は#6
、B = 9
プリント(b)は#9
TEST4(1)

2.閉鎖を定義します。簡単に言えば、クロージャの概念は、我々は関数内で関数を定義する場合、この関数は外側の関数の内部の一時変数を使用し、外部関数の戻り値は、内部関数への参照であるということです、私たちは、クロージャを呼び出します。周りのビット

コードは以下の通りであります:

#平均コードを計算単純な実装は、

DEF()get_avg:
スコア= []#外部の一時変数は、

DEF(ヴァル)をinner_count_avg:#内部関数の平均値算出のための
仮を用いscores.append(ヴァル)#外部関数を可変
戻り和(スコア)/ LEN(スコア)#は、 算出された平均返す

#外部関数inner_count_avg戻り、内部関数を参照戻り

AVG = get_avg()
プリント(AVG(10))#10
プリント(AVGを(11))#10.5
...

3.nonlocalキーワード。上記のコードは、小さな欠陥、繰り返し計算の多くは、我々は新しい平均値の新しい値を取得するために渡したいとき、他の前回の合計が外部一時的な変数によって保存することができますがあります。だから私たちは自然に次のコードを考えます:

平均の計算の単純な実装のコード#改良版
:DEFのget_avg()
リスト内の積分値にスコア0 =#外部の一時変数
、記録の数の変数を添加しながら= 0#カウント
デフinner_count_avgを(ヴァル):平均値算出のため#内部機能
の一時的な変数を使用して+ =ヴァル#外部関数をスコア
= + COUNT 1つの
リターンスコア/ COUNT#が計算された平均返す
#外部関数inner_count_avgリターンを内部関数への参照を返す
平均= get_avg ()
印刷(AVG(10))#エラー
...

変数アクションルール:理由このエラーは、ポイント1を参照してください。スコア+ = valは、実際には、スコア=スコアは+ valを代入して、それはローカル変数のスコアを考慮されているため。スコアとカウントがローカル変数の両方でget_ave機能、内で定義されているので、私たちは、グローバルなキーワードを使用する方法がありません。そして、なぜ私たちは、リストを使用しない、それは、この問題は表示されませんか?我々はlist.append()メソッドを使用しているためだけでなく、理解され、それが割り当てられていません。あなたは、単にこの問題が存在しない場合、変更可能なオブジェクトが存在しないでしょう(つまり、私たちは追加および削除を行うためのその方法のいくつかを呼び出し、変数のアドレス値が変更されないことにより、変更することができます)、変更可能なオブジェクトを考えることができます。

私たちは、Python 3での非ローカルキーワードは、この問題を解決紹介します:

#平均の簡単な計算は、コード2の改良版達成
)DEF get_avgを(:
スコア0 =#外部の一時的な変数をリスト内の整数値にするために
、記録の数の変数を添加しながら= 0#カウント
デフinner_count_avgを(ヴァル):平均値算出のため#内部機能
非ローカルCOUNTを、スコア
スコアは、+#=一時変数を使用してヴァル外部関数は
+ = COUNT 1。
戻りスコア/ COUNT#が計算された平均返す
#外部関数inner_count_avg戻り、内部関数を返します参照
AVG = get_avg()
プリント(AVG(10))#エラー

あなたは環境にPythonの2はそれを解決する方法であることを言うかもしれませんか?実際にはEMM〜は、それが道である、という考えは不変オブジェクト変数オブジェクトが可能になることです。具体的なコードは次のよう:

# - * -コーディング:UTF-8 - * - 
クラススコア:
合格
DEF get_avg():
クラスオブジェクトにS =スコア()#
s.scores = 0.0#注整数除算がそのように定義するために、画分のPython 2廃棄されること浮動小数点
s.count = 0
DEFのinner_get_avg(ヴァル)
。s.count + = 1
s.scores + =ヴァル
s.count / s.scoresを返す
inner_get_avg戻す
AVG = get_avg()
プリント(AVG(10))#10.0
プリント(AVG(11))# 10.5

閉鎖の4.アプリケーション:最初のデコレータ、デコレータは、新たな機能を追加達成するために、飾られる関数を変更することです。私たちが飾られる関数を変更する機能の内側にある場合は、ほとんどの場合、それが閉鎖に使用されます。簡単な例:

デフデコレータ(FUNC):ローカル変数FUNCの#外部関数
DEFラッパー(* argsを、** kwargsから):#はラッパー関数のパラメータの上に渡される受け入れるには、
FUNC(* argsを、** kwargsから戻る )#をローカル外部関数を使用して変数FUNC
リターンwarpperの
@Decoratorの
DEFのbasic_func(名):
'私の名前は'印刷名の
#は同等です
decorator_func(FUNC)

平均化の他の応用例、我々が見ることができる前に、計算が繰り返される場合、効率を向上させることができます。第二に、そこに、より多くの重要なアプリケーションのシナリオである「遅延評価」この機能を使用することで、これは、Djangoのでクエリセットに反映されています。我々はORMのSQLクエリを使用行うと、多くの場合、フィルターを高めるために、異なる判断条件に基づいて、プラスフィルタ時間は、実際に最終結果が実際にクエリを実行するために取得クエリを、行いません。

ここでまた、我々は通常のPythonの閉鎖について話をあなたと見、いくつかのPythonの一般的な面接の質問に応じて、ハを追加するための補完的なパートナーのウェルカムメッセージがあります!私たちはお互いに、進捗ああから学ぶことができることを願っています!

おすすめ

転載: www.cnblogs.com/cherry-tang/p/11202194.html