Pythonの開発者が質問に直面:8つの強制インタビューの質問を

「金や銀3 4」人々はそれを知っていない動作しません、実際には、7月には面接のピークにスイッチであり、生徒たちはまた、仕事を探している軍の波に参加しました。私は経験とインタビューPythonで一瞬のために、実際の状況に基づいて思い付いた、強制的なインタビューの質問の開発についてのPython 8質問、少し必要パートナー、黒板深刻なノックケインがあります!

Pythonの開発者が質問に直面:8つの強制インタビューの質問を

 

1、何であるか、以下の出力コード?説明してください。

DEF extendList(ヴァル、リスト= []):
list.append(ヴァル)
リターンリスト
LIST1 = extendList(10)
LIST2 = extendList(123、[])
LIST3 = extendList(a)は
プリント"LIST1 =%S" %のLIST1の
印刷"LIST2 =%S" %のLIST2の
印刷"LIST3 =%S" %のLIST3

extendListの定義を変更する方法以下の期待される動作を生成することができますか?

上記のコードは、出力がされる次のとおりです。

LIST1 = [10、A] 
LIST2 = [123]
LIST3 = [10、A]

彼らは[] extendListが呼び出されるたびに、パラメータのデフォルト値のリストがに設定されると思います。しかし、その新しい、実際にはケースので、多くの人が誤って、リスト1 = [10]、LIST3 = [「A」]を信じていますデフォルトのリストは、関数が定義されているその瞬間に一度だけ作成されます。

extendListコールリストは、特定のパラメータが指定されていない場合は、セットリストの値が使用されます。関数が定義されている場合、デフォルトのパラメータを持つ式が計算されているので、これは代わりに、コールの時に計算されるのです。したがってLIST3リスト1と同じデフォルトリスト(ベース)上で動作しています。そして、LIST2は別のリストに(計算)が運転されます。(パラメータ値のリストとして空のリストを渡すことが所有)。

次のようにextendList定義を変更することができます。

、新しいリストを作成するが、パラメータの具体的なリストはありません。

次のコードは、所望の結果を生成することができるかもしれません。

DEF extendList(ヴァル、リスト=なし)
:リストなしであれば
、リスト= []
list.append(ヴァル)
リターンリストは

上記の変更により、出力は次のようになります。

LIST1 = [10] 
LIST2 = [123]
LIST3 = [A]

 

Pythonの開発者のインタビューの質問:2、このコードの次の出力があるものだろうか?説明してください。

DEF乗数():
戻り、λX:iが範囲内にiについてXを*(4)]
プリント[M(2)乗算器におけるM用()]

どのようにして目的の結果を生成するために上記の乗数の定義を変更できますか?

上記の結果は、(我々は[0、2、4、6]にしたくないもの)[6、6、6、6]出力コードです。

上記の問題の理由は、Pythonバインディングの閉鎖を遅延させることです。これは、パラメータの値が閉鎖に見つけることが、内部関数が呼び出されることを意味しています。従って、乗算器の任意の関数は、()私は見て周りの範囲内であろうの値を返すために呼び出されます。その時点で、機能に関係なく、サイクルのコールが終了したか否かを返し、I 3の最終的な値が与えられました。

コードの上部セクションは、最終的に6(* 3 2)返される値2、上を通過しているのでこのように、関数は、渡された値を返すたびに、3乗算されます。偶然にも、「Pythonのヒッチハイクガイド」には、ラムダ関数との相関関係にも広く誤解知識を持っていますが、この場合に同じではない、と指摘しました。ラムダ式で作成された関数は何も特別な場所であり、それは実際には同じデフ機能の作成です。

ここでは、この問題を解決するために、いくつかの方法があります。

一つの解決策は、Pythonのジェネレータを使用することです。

:DEF乗算器()
の範囲内のiについて(4):収量ラムダX:私は* X

別の解決策はすぐにバインドするために、デフォルトの機能を使用して、クロージャを作成することです。

DEF乗数():
戻り、λX、iは= I:範囲(4)でiについてXを*]

代替の種類があり、部分的機能を使用することです:

functoolsから部分インポート
オペレータインポートMULから
)(DEF乗数:
[(4)の範囲内にiについて部分(MUL、I)]を返します

図3は、このコードの次の出力は何でしょうか?説明してください。

クラス親(オブジェクト):
X = 1
クラスCHILD1(親):
パス・
クラスCHILD2(親):
合格
Parent.x、Child1.x、Child2.x印刷
Child1.x = 2
印刷Parent.x、Child1.x、CHILD2を.X
Parent.x = 3
プリントParent.x、Child1.x、Child2.x

出力は次のようになります。

1 1 1 
1 2 1
3 2 3

だから、多くの人は、出力の最後の行ではなく32 1.なぜ変更parent.xの323で、なぜ混乱したり驚いているだけでなく、child2.xの値を変更しますか?しかし同時にそれはChild1.xの値を変更しませんか?

この回答への鍵は、Pythonで、クラス変数は、内部辞書の形で渡されるということです。

変数名は現在のクラスの下に辞書に見つからない場合。(例えば、その親クラスなど)より上級クラスでは、変数名を参照するまで、専用の検索で発見されました。(参照変数名は、そのクラスと上位クラスで見つからない場合は、プロパティのエラーにつながります。)

(値1)、変数xがクラスおよびそのサブクラスを挙げることができるクラスようしたがって、X = 1は、親クラスに設定されています。最初のprint文の出力が111である理由です

そのサブクラスの値のいずれかが(例えばたとえば、我々はステートメントChild1.x = 2を実行する場合)に上書きされた場合したがって、この値は唯一のサブクラスで変更されます。二print文の出力が121である理由はここにあります

最終的に、値が親クラスに変更されている場合(例えば、我々は声明Parent.x = 3を実行したときと言う)、この変更は、(この場合はCHILD2がある)サブクラスの値を上書きしていない人に影響を与えます第三print文の出力が323である理由です

4、Python2何で次のコードの出力が結果になりますか?説明してください。

DEF DIV1(X、Y):
プリント"%S /%S =%S" %(X、Y、X / Y)
デフDIV2(X、Y):
プリント"%sの//%S =%S" % (X、Y、X // Y)
DIV1(5,2)
DIV1(5、2)
DIV2(5,2)
DIV2(5、2)。

何の結果はのpython3で違うのでしょうか?(もちろん、print文は、構文のpython3に変換されると仮定した場合)

Python2では、上記のコードの出力は次のようになります

5/2 = 2 
5.0 / 2 = 2.5
5 // 2 =
5.0 // 2.0 = 2.0

両方が整数である場合、デフォルトでは、Pythonの2が自動的に計算整形を行います。したがって、5/2結果は2であり、その結果は2.5であった5./2

Python2で、あなたは次の参照を追加することで、この動作を無効にできることに注意してください。

将来の輸入部門から

//演算子は関係なく、常にオペレータのタイプの整形手術部門を実行することにも注意してください。でも、Pythonの2の結果では5.0 // 2.0が2.0である理由です。しかし、のpython3では、そのようなプロパティが存在しません、

例えば、両端が成形される場合には、分割整形を行いません

次のようにこのように、のpython3で、結果は次のようになります。

5/2 = 2.5 
5.0 / 2 = 2.5
5 // 2 =
5.0 // 2.0 = 2.0

 

注:Pythonの3では、/オペレータは、浮動小数点除算を行っているが、//割り切れる行う(残り市販すなわち、10 3 @このような結果なしに、それは3であり、(削除残りの部分から切断され、-7 )// 3は、アルゴリズムや他の多くのプログラミング言語は、Python 2 /で分割されているときに、彼らが0の方向に整数除算を重視します、注意を払う必要が同じではない。-3の結果であり、それは、Python 3であります//同じ演算子で)

 

5、次のコードの出力は何でしょうか?

リスト= [A、B、C、D、E] 
印刷リスト[10:]

次のコード出力は[]はIndexErrorエラーが発生しません。同様に、予想通り、インデックスがメンバーのリストを取得するにはメンバーの数を超えてみてください。

例えば、[10]のリストを取得しようとし、それ以降のメンバーはIndexErrorをもたらします。

しかし、リストのスライスを取得しようと、インデックスは、メンバーの数ははIndexErrorを生成しません超過し始めたが、唯一の空のリストを返します。

時間がバグを生じさせることは追跡することが困難であり、エラーが発生しない実行されているので、これは、特に嫌な難病です。

6、次のコードを考えてみます。

リスト= [[]] * 5 
リスト#出力?
リスト[0] .append(10)
リスト#出力?
リスト[1] .append(20)
リスト#出力?
list.append(30)
リスト#出力?

2,4,6,8行は出力何の結果だろうか?説明してください。

次のように出力結果は以下のとおりです。

[]、[]、[]、[]、[] 
[10]、[10]、[10]、[10]、[10]
[10、20]、[10、20]、 [10、20]、[10、20]、[10]、[20]
[10、20]、[10、20]、[10、20]、[10、20]、[10、20]、30 ]

次のように説明しました:

第一出力線は、直感的に容易に、例えば、リスト= [] * 5は、5つの空のリストを作成するだけで、理解しました。しかし、式のリストを理解する= [[]] * 5キーポイントは、それが独立した5のリストを含むリストを作成することはないということですが、それが作成したのと同じ参照の5のリストを含むリストです。これだけを理解することによって、私たちはより良い次の出力を理解することができます。

リスト[0] .append(10)図10は、第1のリストに追加しました。

すべての5つのリストは参照の同じリストがあるので、ので、しかし、結果は次のようになります。

[10]、[10]、[10]、[10]、[10]

同様に、リスト[1] .append(20)図20は、第2のリストに取り付けられます。しかし、また、同じ5つのリストに起因するには、参照のリストであるため、出力は以下のようになります。

[10、20]、[10、20]、[10、20]、[10、20]、[10、20]

対照的に、list.append(30)従って、結果を生成する、全体の外側のリストの追加、新しい要素である:[10、20]、[10、20]、[10、20]、[10、20] 、[10、20]、30]。

7、N番号のリストを考えます。

N桁を含むリストを考えます。

新しいリストを生成するための単一のリスト式は、リストには、以下の条件を満たした値のみが含まれています。

(A)偶数値

(B)は、元のリスト要素は、さらにスライスです。

リスト[2]が含まれている場合、例えば、値が偶数です。そして、この値は、それらの新しいリストに含まれるべきです。(2さえ)上の元のリスト内の数字の配列であってもそのため。しかし、リストは、[3]偶数が含まれている場合は、

その数は、元のリストであるため、その上に奇数列、新しいリスト、それらに含まれるべきではありません。

次のようにこの問題の簡単な解決策は以下のとおりです。

[リスト内のxのX [:: 2]のx%2 == 0の場合]

たとえば、次のリストを与えられました:

リスト= [1、3、5、8、10、13、18、36、78]

リストの式[リスト内のxのX [:: 2]のx%2 == 0であればその結果の、

[10、18、78]

この式の作業ステップは、偶数スライスを取り除くための最初のステップであります

すべての奇数除去し第2のステップ。

図8は、以下の辞書のサブクラスで与えられ、次のコードは、それを実行することができますか?なぜ?

クラスDefaultDict(辞書):
DEF __missing __(自己、鍵):
戻す[]
D = DefaultDict()
D [florp] = 127

実行することができ。

削除キーは、DefaultDictクラスを実行すると、インスタンスは自動的にシリーズをインスタンス辞書です。

Pythonの開発者が質問に直面について、私たちは何より良いそれに追加していませんか?あなたは、Pythonのインタビューで、何か面白いものに出会ったことがありますか?ウェルカムメッセージ!

おすすめ

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