前段時間面試網易、深信服等親身遇到,遂做記錄總結。
Python開發理論基礎面試題
一、Python的內存管理
1、python內存管理是由私有堆空間管理,需要申請和釋放內存
2、用引用計數機制實現垃圾回收
3、Python有內存池的機制,爲了防止頻繁申請和釋放內存,會將不用內存放到內存池而不是返回給操作系統
二、Python的gc垃圾回收
1、在Python中,主要通過引用計數進行垃圾回收
2、通過 “標記-清除” 解決容器對象可能產生的循環引用問題
3、通過 “分代回收” 以空間換時間的方法提高垃圾回收效率
三、python裏while 1 和while True的區別?
1、由於Python2中,True/False不是關鍵字,因此我們可以對其進行任意的賦值
這就導致程序在每次循環時都需要對True/False的值進行檢查
2、而對於1,則被程序進行了優化,而後不會再進行檢查
While true 和while 1在python3裏面沒有區別
四、Python爲什麼類要繼承object?,繼承和不繼承有什麼區別?
1、在python2中繼承 object 類的是新式類,不繼承 object 類的是經典類
2、新式類,當調用 負類的方法時候,Python 會按照廣度優先方式去搜索
而經典類是用深度優先方法去搜索
五、講講Pythond裝飾器?
1、裝飾器是一個函數,其主要用途是包裝另一個函數或類。
2、 這種包裝的首要目的是透明地修改或增強被包裝對象的行爲。
六、什麼是Python的閉包?
1、內層函數引用了其外部作用域的變量,然後返回內層函數的情況,稱爲閉包。
2、python一般以內外函數實現
七、python節省內存的方法:
1、類裏面增加__slot__方法, 如果確定了對象屬性成員,不會再動態增加
2、使用touple代替list
3、Namedtuple代替數據對象
4、適當使用弱應用
5、生成器、代器代替集合數據類型
原則一:儘量用不可變對象類型代替可動態增加對象類型
八、講講python弱引用
1、對一個對象進行弱引用,即不會由引用計數,即這個對象的內存還是有可能被回收掉
2、一般弱引用的應用場景是,些還有用但並非必須的對象,並且很費資源的對象
九、什麼是閉包?
1、使用環境範圍之外的變量,即內函數在其它定義環境使用
2、當一個內嵌函數引用其外部作作用域的變量,我們就會得到一個閉包. 總結一下,創建一個閉包必須滿足以下幾點
①、必須有一個內嵌函數
②、內嵌函數必須引用外部函數中的變量
③、外部函數的返回值必須是內嵌函數
十、Python的裝飾器原理
1、原理是閉包.
2、在不用修改原函數代碼情況下,就可以給原函數添加新功能,並且在調用的時候和原來調用一模一樣
十一、Python字典的底層實現?
1、字典底層是哈希實現的
2、容量大於等於 2/3 時,字典就會擴容(擴容時散列表中鍵的次序變化)
3、在對元素進行變化操作(刪除等)時,底層只是對數據進行狀態切換(Unused態、Active態、和Dummy態)
4、解決哈希衝突的方法:是開放地址方法
十二、python有什麼調試工具?
1、pdb
2、pySnooper
十三、什麼是協程?
1、輕量級的線程
2、處於用戶態、非搶佔
3、用戶調度、非系統調度,效率較高
4、極高的執行效率,因爲子程序切換而不是線程切換,沒有了線程切換的開銷
5、不需要多線程的鎖機制,因爲只有一個線程在執行
十四、Python的協程?
1、python2是通過yeil實現、greve
2、python3是通過synix
十五、__new__() 與 __init__()的區別
1、__new__是一個靜態方法,而__init__是一個實例方法.
2、__new__方法會返回一個創建的實例,而__init__什麼都不返回.
3、只有在__new__返回一個cls的實例時後面的__init__才能被調用.
4、當創建一個新實例時調用__new__,初始化一個實例時用__init__.
十六、GIL鎖?爲什麼使用GIL鎖?
1、即全局解釋鎖,每個時間段只允許一個線程在CPU中運行
2、爲了解決多線程之間數據完整性和狀態同步的問題,保證Python解釋器中原子操作的線程安全,解決不同線程之間的數據一致性問題。