pythonインタビュー質問のコレクション(3):[Pythonクラシックインタビュー質問(1)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.cnblogs.com%2Fwagyuze%2Fp%2F11661434.html)
浮動小数点数の実行結果が等しいかどうかを判別します。
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
通常の1次元に縮小された2次元のリストがあります。たとえば、レモンクラスではグループで生徒がいるので、グループ情報から全員の名前を取得したいと思います。
groups =[['huahua','xiaojian'],['musen','yuze'],['keyou']]
# 答えを得た['huahua','xiaojian','musen','yuze','keyou']
最も簡単な方法は、forループを介して1つずつ抽出できます。
names =[]for group in groups:for name in group:
names.append(name)print(names)
ただし、インタビュー中に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']
# リストスプライシング
また、リストの理解によって簡単に解決することもできます。
a =[e for group in groups for e in group]
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