Effective Python 学习笔记 3

共500字 阅读时长约1分 访问量

不要在for和while循环后面写else语句块

Python提供了一种很多编程语言都不支持的功能,可以在循环内部的语句块后面直接写else块。
1
2
3
4
5
6
7
8
9
10
for i in range(3):
print('Loop %s' % i)
else
print('Loop done!')
>>>
Loop 0
Loop 1
Loop 2
Loop done!
# 即程序没有成功执行完,就会执行else语句
要点
  1. 只有当整个循环猪蹄都没有遇到break语句时,循环后面的else块才会执行
  2. 循环后加else块,这种写法不直观,又容易引起误解

合理利用try/except/else/finally结构中的每个代码块

finally块
  • 如果既要将异常向上传播,又要在异常发生时执行清理工作,尝试使用try/finally结构
1
2
3
4
5
6
7
8
# 这是一项常见的用途,就是确保能够可靠的关闭文件句柄
handle = open('file')
try:
data = handle.read()
finally:
handle.close()
# read方法所抛出的异常会向上传播给调用方,而finally块中的close方法将一定会被执行。
# open方法一定要放在try之外,因为如果打开文件时发生异常,那么程序应该跳过finally块。
else块
  • try/except/else结构可以清晰地描述出哪些异常会由自己地代码处理、哪些异常会传播到上一级。
  • 如果try没有异常,那么就执行else块。
1
2
3
4
5
6
7
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…的区别

混合使用
详见书本
要点
  1. 无论try块是否发生异常,都可利用try/finally符合语句中的finally块来执行清理工作
  2. else块可以用来缩减try块中的代码量,并把没有发生异常时索要执行的语句与try/except代码块隔开
  3. 顺利运行try块后,若想使某些操作能在finally块的清理代码之前执行,则可将这些操作写到else块中