判斷浮點數的運行結果是否相等:html
a = 0.1
b = 0.2
c = 0.3
assert a + b == c
本題考查的是計算機的浮點運算知識點。不只是 python 語言,其餘的編程語言也面臨一樣的問題:在進行浮點運算的時候,10 進製表示方式會丟掉它的精度,形成運算結果與實際結果不符合。python
這是因爲底層 CPU 和運算標準經過本身的浮點單位去執行算術時的特徵決定的。看似有窮的小數, 在計算機的二進制表示裏倒是無窮的。面試
因此在進行高進度浮點運算的時候必定要注意,尤爲是自動化測試過程當中須要進行斷言很是容易出錯。編程
斷言失敗,拋出 AssertionError 錯誤。app
使用 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
有一個二維列表,降成普通的一維的。好比說檸檬班都會有學員分組,咱們想經過分組信息去獲取全部的學員名稱。測試
groups = [['huahua', 'xiaojian'], ['musen', 'yuze'], ['keyou']]
# 獲得結果 ['huahua', 'xiaojian', 'musen', 'yuze', 'keyou']
最簡單的方式能夠經過 for 循環的方式一一提取:spa
names = []
for group in groups:
for name in group:
names.append(name)
print(names)
可是在面試的時候可能會加一些限制,好比讓你用一行代碼實現,這個時候就須要對 python 基礎有進一步的理解了,好比說使用 sum 函數:code
names = sum(groups, [])
很是簡單就實現了一樣的功能。 sum 函數爲何能夠作到呢?先看一個簡單的例子:
a = sum([1,2,3])
獲得的結果是 6, 也就是說, sum 函數會把一個列表裏面的每一個元素相加。可是 sum 函數還能夠有第二個參數:開始值,默認爲 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]
class A: def run(self): print("a is running") class B: def run(self): print("b is running") class C(A, B): pass # 會打印什麼??? C().run()
多重繼承常常用來出面試題。在這個考題中,C 類的父類 A 和 B 都實現了 run 方法,那在 C 的對象裏究竟是優先調用哪個呢?
答案是: a running
class A: def run(self): print("a running") class B(A): pass class C(A): def run(self): print("C running") class D(B, C): pass # 會打印什麼??? D().run()
他們的繼承關係圖能夠簡化以下,這個問題又稱爲菱形問題或者鑽石問題:
答案是: c running
若是咱們不讓 C 類繼承 A 呢?
class A: def run(self): print("a running") class B(A): pass class C: def run(self): print("C running") class D(B, C): pass # 會打印什麼??? D().run()
他們的繼承關係圖能夠簡化以下,能夠簡稱爲 v 型問題:
答案會變成 a running
具體緣由是 python 的繼承會遵循特定的順序,優先級排在前面的,子類會優先使用。怎麼快速查看這種繼承順序呢?經過D.__mro__
去查看
好比在 菱形問題上,d 的順序是這樣的:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
D 排在最前面,若是 D 定義了 run 方法,就會被優先使用,而後是 B, 而後是C, 而後是 A, 最後是 object 基類。
而在 V 行問題上,d 的順序又變成了這樣:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)
A 和 C 互換了順序。形成 2 個題目的答案不一致。
原文出處:https://www.cnblogs.com/wagyuze/p/11661434.html