- 盡量用異常來表示特殊情況,而不是返回None
None返回值 無法區(qū)分正常情況和特殊情況
解決方式: - 返回一個(gè)二元組,其中一個(gè)表示成功與否的狀態(tài),兩一個(gè)值為功能值
- 直接把異常拋給調(diào)用者來處理。
- 了解如何在閉包里使用外圍作用域中的變量
python3:使用關(guān)鍵字nonlocal修飾變量名,在變量賦值時(shí),自動會在上層作用域查找。
python2:不支持nonlocal關(guān)鍵字,使用變量的引用。
在表達(dá)式引用變量是,解釋器解析作用域的順序:
1. 當(dāng)前函數(shù)的作用域
2. 任何外圍作用域(當(dāng)前函數(shù)的其他函數(shù))
3. 包含當(dāng)前代碼的模塊的作用域
4. 內(nèi)置作用域(包含len、str等函數(shù)的作用域)
- 考慮用生成器來代替直接返回列表的函數(shù)
當(dāng)列表長度不可預(yù)知或者比較長的時(shí)候,內(nèi)存的壓力會非常大。而生成器剛好彌補(bǔ)了這個(gè)問題。
調(diào)用生成器時(shí),生成器不會運(yùn)行,只是返回一個(gè)迭代器。只有調(diào)用next(generator)時(shí),迭代器才會吧生成器推到下一個(gè)yield表達(dá)式處。 - 小心迭代器作為參數(shù)
因?yàn)榈髦划a(chǎn)生一輪結(jié)果,就會停止,如果多次使用迭代器,再第二次后的此參數(shù)將為空列表或者其他值。所以有迭代器的參數(shù),首先要把迭代器的結(jié)果先拷貝一份。 - 用數(shù)量可變的位置參數(shù)減少視覺雜訊
*args(位置參數(shù))會帶來兩個(gè)問題: - 變長參數(shù)在傳給函數(shù)時(shí),需要先轉(zhuǎn)為元組,(a = [1,2,3]->*a)如果使用此方式處理一個(gè)生成器,需要考慮內(nèi)存占用情況。
- 會給重構(gòu)帶來一定麻煩,比如新增一個(gè)函數(shù)參數(shù)。
- 用關(guān)鍵字參數(shù)來表達(dá)可選的行為
關(guān)鍵字參數(shù)規(guī)則:
1. 傳參的順序不限制,也可以混合(某些使用關(guān)鍵字參數(shù)傳參,某些不使用)
2. 位置參數(shù)必須在關(guān)鍵字參數(shù)之前
3. 每個(gè)參數(shù)只能一次
- 用None和文檔字符串來描述動態(tài)默認(rèn)值的參數(shù)
代碼模塊在加載的時(shí)候,參數(shù)的默認(rèn)值就固定了。如果想使用動態(tài)的默認(rèn)值:使用None,并用文檔字符串說明。
def some_func(par=None):
#參數(shù)par:默認(rèn)值為123
par = 123 if par == None else par
- 用只能以關(guān)鍵字形式指定的參數(shù)來確保代碼明晰
- python3語法:定義只能以關(guān)鍵字形式來指定參數(shù)的函數(shù)。
def some_func(number, *, default=0)
上例中,調(diào)用some_func函數(shù),如果想傳default參數(shù),必須使用some_func(100, default=1)
- python2方式:使用**kwargs的方式。