某上市公司自動化測試面試題洩露了!
一、浮點數運算
◆ 題目
判斷浮點數的運行結果是否相等:
◆ 題目解析:
本題考查的是計算機的浮點運算知識點。
不僅是python語言,其他的編程語言也面臨同樣的問題:
在進行浮點運算的時候,10 進製表示方式會丟掉它的精度,造成運算結果與實際結果不符合。
這是由於底層 CPU 和運算標準通過自己的浮點單位去執行算術時的特徵決定的。看似有窮的小數, 在計算機的二進制表示裡卻是無窮的。
所以在進行高進度浮點運算的時候一定要注意,尤其是自動化測試過程中需要進行斷言非常容易出錯。
◆ 題目答案:
斷言失敗,拋出 AssertionError 錯誤。
◆ 解決方案:
使用Decimal模塊:
Decimal() 可以維持浮點數的精度,在金融領域和測試領域等精度要求高的行業有非常大的作用。
但是一定要注意: Decimal() 傳的參數一定要是字符串類型,如果是數據類型會再次丟掉精度。
二、列表的扁平化和降維
◆ 題目
有一個二維列表,降成普通的一維的。
比如說檸檬班都會有學員分組,我們想通過分組信息去獲取所有的學員名稱。
◆ 方法一
最簡單的方式可以通過for循環的方式一一提取:
◆ 方法二
但是在面試的時候可能會加一些限制,比如讓你用一行代碼實現,這個時候就需要對python基礎有進一步的理解了。
比如說使用sum函數:
非常簡單就實現了同樣的功能。
sum函數為什麼可以做到呢?先看一個簡單的例子:
得到的結果是6。
也就是說,sum函數會把一個列表裡面的每個元素相加。
但是sum函數還可以有第二個參數:開始值,默認為0,所以上述過程其實可以寫成:
依據同樣的道理,可以對列表進行降維操作:
◆ 方法三
通過列表推導式也可以方便的解決:
三、多重繼承
多重繼承經常用來出面試題。
在這個考題中,C類的父類A和B都實現了run方法,那在C的對象裡到底是優先調用哪一個呢?
答案是:a running
◆ 菱形問題
他們的繼承關係圖可以簡化如下,這個問題又稱為菱形問題或者鑽石問題:
答案是:c running
如果我們不讓C類繼承A呢?
他們的繼承關係圖可以簡化如下,可以簡稱為v型問題:
答案會變成a running
◆ 題目解析
具體原因是 python 的繼承會遵循特定的順序,優先級排在前面的,子類會優先使用。
怎麼快速查看這種繼承順序呢?通過D.__mro__去查看
比如在菱形問題上,d的順序是這樣的:
(<class>, <class>, <class>, <class>, <class>)
/<class>/<class>/<class>/<class>/<class>
D 排在最前面,如果 D 定義了 run 方法,就會被優先使用,然後是 B, 然後是C, 然後是 A, 最後是 object 基類。
而在V行問題上,d的順序又變成了這樣:
(<class>, <class>, <class>, <class>, <class>)/<class>/<class>/<class>/<class>/<class>
A和C互換了順序。造成2個題目的答案不一致。
閱讀更多 檸檬班軟件測試 的文章