Effective Python 學(xué)習(xí)筆記 3
不要在for和while循環(huán)后面寫else語句塊
Python提供了一種很多編程語言都不支持的功能修械,可以在循環(huán)內(nèi)部的語句塊后面直接寫else塊。
for i in range(3):
print('Loop %s' % i)
else
print('Loop done!')
>>>
Loop 0
Loop 1
Loop 2
Loop done!
# 即程序沒有成功執(zhí)行完谦去,就會執(zhí)行else語句
要點(diǎn)
- 只有當(dāng)整個循環(huán)豬蹄都沒有遇到break語句時敏释,循環(huán)后面的else塊才會執(zhí)行
- 循環(huán)后加else塊暇检,這種寫法不直觀用踩,又容易引起誤解
合理利用try/except/else/finally結(jié)構(gòu)中的每個代碼塊
finally塊
- 如果既要將異常向上傳播个唧,又要在異常發(fā)生時執(zhí)行清理工作江解,嘗試使用try/finally結(jié)構(gòu)
# 這是一項(xiàng)常見的用途,就是確保能夠可靠的關(guān)閉文件句柄
handle = open('file')
try:
data = handle.read()
finally:
handle.close()
# read方法所拋出的異常會向上傳播給調(diào)用方徙歼,而finally塊中的close方法將一定會被執(zhí)行犁河。
# open方法一定要放在try之外,因?yàn)槿绻蜷_文件時發(fā)生異常魄梯,那么程序應(yīng)該跳過finally塊桨螺。
else塊
- try/except/else結(jié)構(gòu)可以清晰地描述出哪些異常會由自己地代碼處理、哪些異常會傳播到上一級酿秸。
- 如果try沒有異常灭翔,那么就執(zhí)行else塊。
def load_json_key(data, key):
try:
result_dict = json.loads(data)
except ValueError as e:
raise KeyError from e
else:
return result_dict[key]
Raise和Raise...from...的區(qū)別
混合使用
詳見書本
要點(diǎn)
- 無論try塊是否發(fā)生異常辣苏,都可利用try/finally符合語句中的finally塊來執(zhí)行清理工作
- else塊可以用來縮減try塊中的代碼量肝箱,并把沒有發(fā)生異常時索要執(zhí)行的語句與try/except代碼塊隔開
- 順利運(yùn)行try塊后,若想使某些操作能在finally塊的清理代碼之前執(zhí)行稀蟋,則可將這些操作寫到else塊中