py的語言特性: 動態強類型
靜/動態: 編繹/運行 時確定變量類型
弱/強類型: 會/不會發生隱式類型轉換
py作為後端語言的優缺點
語言簡單靈活,開發效率高
膠水語言,輪子多,擁有Django這種的成熟web框架
執行效率低,性能不如其他語言
動態語言,沒有類型聲明時就沒有自動補全,而且很多問題要運行後才能發現
什麼是duck type?
鴨子類型更關注對象的行為,只要實現了某種接口方法就行,而不在乎是什麼類型
比如說定義了 __iter__魔法方法的類實例對象都可以用for來迭代
什麼是monkey patch?
monkey patch就是運行時替換對象,本質上是對象的重新賦值
py3和py2的區別
print在py3裡是一個函數,在py2裡只是一個關鍵字
py3文件的默認編碼是utf8,py2文件的默認編碼是ascii
py3的str是unicode字符串,而py2的str是bytes
py3的range()返回一個可迭代對象,py2的 range()返回一個列表,xrange()返回一個可迭代對象,
py3的除法返回float,py2的除法返回int
可變對象與不可變對象
可變對象: list,dict,set
不可變對象: bool,int,float,tuple,str…
函數傳遞中*args,**kwargs
用來處理可變參數,接收參數後,args會變成一個tuple,kwargs會變成一個dict
什麼時候需要捕獲異常?
Django的ORM框架操作數據庫時,獲取數據,更新數據等都有可能會異常
socket通信時,recv()方法可能會因為對方突然中斷連接導致異常
什麼是CPython GIL?
GIL,Global Interpreter Lock,即全局解釋器鎖
引入GIL是因為CPython的內存管理並不是線程安全的,
為了保護多線程下對python對象的訪問,每個線程在執行過程中都需要先獲取GIL,保證同一時刻只有一個線程在執行代碼
GIL使得python的多線程不能充分發揮多核CPU的性能,對CPU密集型程序的影響較大
什麼是生成器?
生成器是一種可迭代對象,可以掛起並保持當前的狀態
生成器遇到yield處會停止執行,調用next()或send()才會繼續執行
定義一個生成器有兩種方式,一種是生成器推導式,一種是在普通函數中添加yield語句並實例化
淺拷貝和深拷貝
淺拷貝出來的是一個獨立的對象,但它的子對象還是原對象中的子對象
深拷貝會遞歸地拷貝原對象中的每一個子對象,因此拷貝後的對象和原對象互不相關。
迭代器與可迭代對象的區別
可迭代對象類,必須自定義__iter__()魔法方法,range,list類的實例化對象都是可迭代對象
迭代器類,必須自定義__iter__()和__next__()魔法方法,用iter()函數可以創建可迭代對象的迭代器
閉包
閉包就是一個嵌套函數,它的內部函數 使用了 外部函數的變量或參數,它的外部函數 返回了 內部函數
可以保存外部函數內的變量,不會隨著外部函數調用完而銷毀
python垃圾回收機制
引用計數為主,標記清除 和 分代回收為輔
引用計數機制是這樣的
當對象被創建,被引用,作為參數傳遞,存儲到容器中,引用計數+1
當對象離開作用域,引用指向別的對象,del,從容器中移除,引用計數-1
當引用計數降為0,python就會自動回收該對象所在的內存空間,
但是引用計數無法解決循環引用的問題,所以引入了標記清除和分代回收機制
async和await的作用
async: 聲明一個函數為異步函數,函數內只要有await就要聲明為async
await: 搭配asyncio.sleep()時會切換協程,當切換回來後再繼續執行下面的語句
內置的數據結構和算法
內置數據結構: list,dict,tuple,set
內置算法: sorted,max
collections模塊
collections模塊提供了一些好用的容器數據類型,其中常用的有: namedtuple,deque,Counter,OrderedDict,defaultdict
為什麼dict查找的時間復雜度是O(1)?
dict底層是哈希表,哈希表類似於C語言的數組,可以實現按索引隨機訪問
但dict的key不一定是整數,需要先通過哈希函數,再經過取余操作轉換為索引
list tuple的底層結構
list和tuple底層都是順序表結構
list底層是可變數組,數組裡存放的是元素對象的指針
set的底層結構
哈希表,key就是元素,value都是空
class方法 和 static方法的區別
class方法的第一個參數是cls,可以訪問類屬性,類方法
static方法和普通函數一樣,只不過是放在類裡,要通過類或實例來調用,但是它不能訪問類和實例的屬性和方法
什麼是裝飾器?
裝飾器是一個接收函數作為參數的閉包函數
它可以在不修改函數內部源代碼的情況下,給函數添加額外的功能
import time
def calc_time(func):
def inner():
t1 = time.time()
func()
t2 = time.time()
print('cost time: {}s'.format(t2-t1))
return inner
什麼是元類? 使用場景
元類是創建類的類,type還有繼承自type的類都是元類
作用: 在類定義時(new, init)和 類實例化時(call) 可以添加自定義的功能
使用場景: ORM框架中創建一個類就代表數據庫中的一個表,但是定義這個類時為了統一需要把裡面的類屬性全部改為小寫,這個時候就要用元類重寫new方法,把attrs字典裡的key轉為小寫