「Python 面試」第四次更新

圖片描述

閱讀本文大約須要 5 分鐘。

15.說一說 GIL

前面有提到因爲 Python 基於 C 語言編寫的解釋器中設置了一個 GIL 全局變量鎖,該鎖使得 Python 的多線程在處理 CPU 計算密集型任務時,同一時刻只能有一個線程在運行,這也是爲何說 Python 的多線程是一個「假性多線程」的緣由。python

解決 GIL 的辦法在處理 CPU 計算密集型任務時,使用多進程 + 協程,發揮計算機多核的威力,而處理 I/O 密集型,則可使用多線程。git

16.說一說 Python 中的垃圾回收機制(GC)

  • 引用計數清零
  • 標記-清除
  • 隔代回收
    這裏有一篇文章能夠參考一下。垃圾回收機制

17.說一說 Python 中的函數式編程

  • lambdagithub

    lambda 匿名函數,使用匿名函數能夠幫助咱們簡化代碼,且節省程序因爲顯示建立函數的消耗。面試

    示例:算法

    # 冒號左邊是參數, 右邊是表達式,lambda 返回的是右邊表達式的結果
    L2 = lambda x : x * x
    print(L2(5))
    
    # 結果爲 25
  • map數據庫

    map(func,*Iterable),map 函數經過將可迭代對象傳入 func 函數,所有執行。編程

    示例:微信

    # 至關於 [1*1, 2*2, 3*3, 4*4]
    L2 = list(map(lambda x: x * x, range(1, 4)))
    print(L2)
    
    # 結果爲
    [1, 4, 9, 16]
  • reduce多線程

    reduce(func, *sequence),reduce 函數能夠將函數 func 迭代調用。函數式編程

    示例:

    from functools import reduce
    
    
    # 至關於 ((1*2)*3)
    L2 = reduce(lambda x, y: x * y, range(1, 4))
    print(L2)
    
    # 結果爲
    6
  • filter

    filter(func,*Iterable),filter 函數經過將可迭代對象當作參數傳遞給 func 函數,並返回 func 函數中返回結果爲 True 的值。

    示例:

    # 至關於 g = [x for x in range(10) if x < 3]
    L2 = list(filter(lambda x: x < 3, range(10)))
    print(L2)
    
    # 結果爲
    [0, 1, 2]

18.is 和 == 的區別

  • a is b 比較的是 a 和 b 的「id」是否相同
  • a == b 比較的是 a 和 b 的「值」是否相同

19.range 和 xrange 的區別

對於現現在的 Python 3.x,這個問題其實已經沒有什麼意義了,因爲其在各大面經中都出現過,這裏簡單解釋下。在 Python 2.x 中,rangexrange最大的區別就是xrange生成的不是一個list,而是一個生成器,這二者的區別在問題 13 已經講過,這裏不在贅述。

Python 3.x 中已經移除了range()方法,並將xrange()方法改名爲range()

20.新式類和舊式類的區別

新式類和舊式類的變化主要講的是 Python 中類的「繼承」問題。

舊式類中,類的繼承按照「從左往右,深度優先遍歷」的原則。

新式類中,類的繼承按照「C3 算法」的原則:若是子類在繼承來自不一樣父類的方法是不同的時候,會從下而上,先左後右的合併繼承方法。若是有同樣的方法,則會繼承第一個方法而後捨棄另外一個相同的方法,接着合併其餘不一樣的方法。解決了舊式類繼承中存在的二義性和單調性。

示例:

# 新式類

class B:
    def __init__(self,name):
        self.name = name

    def get_name(self):
        return 'B'

class C:
    def __init__(self,name):
        self.name = name

    def get_name(self):
        return 'C'

class BC(B, C):
    pass

b = B('B')
c = C('C')
bc = BC('C')

print(bc.name)
name = bc.get_name()
print(name)

# 查看 c 在搜索方法時的前後順序
print(bc.__mro__)

# 結果爲
C
B
(<class '__main__.BC'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

另外,新式類相對於舊式類還多了這麼些變化。

  • __slot__:限制實例屬性的設置範圍。
  • __getattrbute__:獲取實例屬性值。
  • type__class__:返回類型統一。

至此,有關 Python 知識點的面試題就已告一段落,下次更新數據庫(MySQL,Redis)方面面試題。

全部內容均已上傳至「GitHub」倉庫,歡迎你們點擊原文查閱。

歡迎你們關注我的微信公衆號「PythonDeveloper」,全部內容第一時間更新於公衆號

全部內容均爲本人一點一點敲出來的,不免會有錯字、語句不通順的地方,歡迎你們指正。

全部示例均已在 Python 3.5 環境下測試經過,若有出錯地方,還請檢查自身 Python 版本。

因本人水平有限,文章內容不免會有出錯,歡迎你們評論指出,一塊兒進步。

相關文章
相關標籤/搜索