Effective Python 学习笔记 3
2019-08-03 本文已影响0人
coder前行
Effective Python 学习笔记 3
不要在for和while循环后面写else语句块
Python提供了一种很多编程语言都不支持的功能,可以在循环内部的语句块后面直接写else块。
for i in range(3):
print('Loop %s' % i)
else
print('Loop done!')
>>>
Loop 0
Loop 1
Loop 2
Loop done!
# 即程序没有成功执行完,就会执行else语句
要点
- 只有当整个循环猪蹄都没有遇到break语句时,循环后面的else块才会执行
- 循环后加else块,这种写法不直观,又容易引起误解
合理利用try/except/else/finally结构中的每个代码块
finally块
- 如果既要将异常向上传播,又要在异常发生时执行清理工作,尝试使用try/finally结构
# 这是一项常见的用途,就是确保能够可靠的关闭文件句柄
handle = open('file')
try:
data = handle.read()
finally:
handle.close()
# read方法所抛出的异常会向上传播给调用方,而finally块中的close方法将一定会被执行。
# open方法一定要放在try之外,因为如果打开文件时发生异常,那么程序应该跳过finally块。
else块
- try/except/else结构可以清晰地描述出哪些异常会由自己地代码处理、哪些异常会传播到上一级。
- 如果try没有异常,那么就执行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]
混合使用
详见书本
要点
- 无论try块是否发生异常,都可利用try/finally符合语句中的finally块来执行清理工作
- else块可以用来缩减try块中的代码量,并把没有发生异常时索要执行的语句与try/except代码块隔开
- 顺利运行try块后,若想使某些操作能在finally块的清理代码之前执行,则可将这些操作写到else块中