不要在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!
|
要点
- 只有当整个循环猪蹄都没有遇到break语句时,循环后面的else块才会执行
- 循环后加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()
|
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…的区别
混合使用
详见书本
要点
- 无论try块是否发生异常,都可利用try/finally符合语句中的finally块来执行清理工作
- else块可以用来缩减try块中的代码量,并把没有发生异常时索要执行的语句与try/except代码块隔开
- 顺利运行try块后,若想使某些操作能在finally块的清理代码之前执行,则可将这些操作写到else块中