Effective Python 学习笔记 3

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语句

要点

  1. 只有当整个循环猪蹄都没有遇到break语句时,循环后面的else块才会执行
  2. 循环后加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]

Raise和Raise...from...的区别

混合使用

详见书本

要点

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

你可能感兴趣的:(Effective Python 学习笔记 3)