Python 經典面試題(一)

1、浮點數運算

題目

判斷浮點數的運行結果是否相等: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

2、列表的扁平化和降維

題目

有一個二維列表,降成普通的一維的。好比說檸檬班都會有學員分組,咱們想經過分組信息去獲取全部的學員名稱。測試

 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]

3、多重繼承

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

相關文章
相關標籤/搜索