Pythonインタビュー質問コレクション(3)

pythonインタビュー質問のコレクション(3):[Pythonクラシックインタビュー質問(1)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.cnblogs.com%2Fwagyuze%2Fp%2F11661434.html)

1.浮動小数点計算###

トピック####

浮動小数点数の実行結果が等しいかどうかを判別します。

 a =0.1 
b =0.2 
c =0.3 
assert a + b == c

質問分析:####

この質問では、コンピューターの浮動小数点操作の知識ポイントを調べます。 python言語だけでなく、他のプログラミング言語も同じ問題に直面しています:浮動小数点演算を実行すると、10進表現の精度が失われ、演算の結果が実際の結果と一致しなくなります。

これは、基盤となるCPUの特性と、独自の浮動小数点ユニットを介して算術を実行する場合の操作標準によるものです。コンピュータのバイナリ表現では、無限に見える10進数は無限です。

したがって、高速フローティングポイント操作を実行する場合、特に自動テスト中にアサーションが必要な場合は注意が必要です。これは非常にエラーが発生しやすくなります。

質疑応答: ####

アサーションは失敗し、AssertionErrorがスローされます。

解決: ####

Decimalモジュールを使用します。

from decimal import Decimal  
a =0.1 
b =0.2 
c =0.3
assert Decimal(str(a))+Decimal(str(b))==Decimal(str(c))

Decimal()は浮動小数点数の精度を維持でき、金融分野や試験分野などの精度要件の高い業界で非常に役立ちます。ただし、注意が必要です。Decimal()は文字列型のパラメータである必要があります。データ型の場合、精度は再び失われます。

Decimal(0.1)+Decimal(0.2)==Decimal(0.3)  # False   
Decimal('0.1')+Decimal('0.2')==Decimal('0.3')  # True

2.平坦化と次元の削減をリストします###

トピック####

通常の1次元に縮小された2次元のリストがあります。たとえば、レモンクラスではグループで生徒がいるので、グループ情報から全員の名前を取得したいと思います。

 groups =[['huahua','xiaojian'],['musen','yuze'],['keyou']] 
# 答えを得た['huahua','xiaojian','musen','yuze','keyou']

メソッドone

最も簡単な方法は、forループを介して1つずつ抽出できます。

 names =[]for group in groups:for name in group:         
  names.append(name)print(names)

方法2

ただし、インタビュー中に1行のコードで実装できるなど、いくつかの制限が追加される場合があります。現時点では、sum関数の使用など、Pythonの基本をさらに理解する必要があります。

 names =sum(groups,[])

同じ機能を実現するのは非常に簡単です。なぜsum関数はそれを行うことができますか?簡単な例を見てみましょう。

 a =sum([1,2,3])

結果は6です。これは、sum関数がリスト内の各要素を合計することを意味します。ただし、sum関数には2番目のパラメーターを含めることもできます。開始値はデフォルトで0であるため、上記のプロセスは実際には次のように記述できます。

 a =sum([1,2,3],0) # 0+1+2+3

同じ原理に基づいて、リストに対して次元削減操作を実行できます。

a =sum([['yuze'],['is'],['a']],[])
# []+[' yuze']+['is']+['a']
# リストスプライシング

方法3

また、リストの理解によって簡単に解決することもできます。

a =[e for group in groups for e in group]

3、複数の継承###

classA:
 def run(self):print("a is running")classB:
 def run(self):print("b is running")classC(A, B):
 pass

# 何が印刷されますか? ? ?
C().run()

複数の継承は、インタビューの質問をするためによく使用されます。この試験の質問では、クラスCの親クラスAとBの両方がrunメソッドを実装しています。どちらが、Cオブジェクトで最初に呼び出されますか?

答えは:ランニング

ダイヤモンドの問題####

classA:
 def run(self):print("a running")classB(A):
 pass

classC(A):
 def run(self):print("C running")classD(B, C):
 pass

# 何が印刷されますか? ? ?
D().run()

それらの継承図は次のように簡略化できます。この問題は、ダイヤモンド問題またはダイヤモンド問題とも呼ばれます。

答えは次のとおりです。c実行中

CクラスにAを継承させない場合はどうなりますか?

classA:
 def run(self):print("a running")classB(A):
 pass

classC:
 def run(self):print("C running")classD(B, C):
 pass

# 何が印刷されますか? ? ?
D().run()

それらの継承図は次のように簡略化できます。これはvタイプの問題と呼ばれます。

答えは実行になります

質問分析####

具体的な理由は、pythonの継承が特定の順序に従い、優先順位が最優先され、サブクラスが最初に使用されるためです。この継承の順序をすばやく確認するにはどうすればよいですか? D .__ mro__を通して表示に移動します

たとえば、ダイヤモンドの問題では、dの順序は次のとおりです。

(< class'__main__.D'>,<class'__main__.B'>,<class'__main__.C'>,<class'__main__.A'>,<class'object'>)

Dが一番上にあります。Dが実行メソッドを定義する場合、最初にB、次にC、次にA、最後にオブジェクト基本クラスが使用されます。

ラインVの場合、dの次数は次のようになります。

(< class'__main__.D'>,<class'__main__.B'>,<class'__main__.A'>,<class'__main__.C'>,<class'object'>)

AとCは順序を逆にしました。 2つの質問に対する答えは一貫していません。

Recommended Posts

Pythonインタビュー質問コレクション(3)
Pythonインタビューの質問
Pythonインタビューの質問の概要
Pythonの古典的なインタビューの質問2
Pythonインタビューの質問:文字列の連結
Pythonは質問に答えます
Pythonインタビュー攻撃
Pythonガベージコレクションメカニズム
Pythonの古典的なインタビューの質問1
XTUプログラミングPythonトレーニング3
LeetCodeブラシ質問の概要python3
Python文字列3形式の出力
Python共通モジュールのコレクション
Pythonでのガベージコレクションについて学ぶ
Pythonの古典的なプログラミングの質問:文字列の置換