-
第13条 合理利用try/except/else/finally结构中的每个代码块
python程序的异常处理可能要考虑四种不同的时机。这些时机可以用try、except、else和finally块来表达。复合语句中的每个块都有特定的用途,他们可以构成很多种有用的组合方式(后续章节会有专项讲解)。下面详细介绍一下每一块的用法。
1.finally块
如果既要将异常向上传播,又要在异常发生时执行清理工作,那就可以使用try/finally结构。这个结构的特点是不管try语句有没有发生异常,都会在执行try之后执行finally语句。下面举个栗子:
图片.png
2.else块
try/except/else结构可以清晰的描述哪些异常会由自己的代码处理,哪些异常会传播到上一级。如果try没有发生异常,那么就执行else。举个栗子,例如我们要从字符串中加载JSON字典数据,然后返回字典里某个键所对应的值:
图片.png
如果数据不是有效的json格式,那么用json.load解码时,会产生ValueError。这个异常就由except来捕获并处理;如果能解码,那么else语句便会执行。
3.混合使用
这一部分读者可以根据自己的情况去使用,下面将书中的例子展示给大家:
图片.png
- 第14条:尽量用异常来表示特殊情况,而不要返回None
(1)用None这个返回值来表示特殊意义的函数,很容易使调用者犯错,因为None和0以及空字符串之类的值,在条件表达式里都会被评估为False。
(2)函数在遇到特殊情况时,应该抛出异常,而不要返回None。调用者看到函数在文档中所描述的异常之后,应该就会编写相应的代码来处理他们了。
-
第15条:了解如何在闭包里使用外围作用域中的变量
有必要解释一下何谓“闭包”。
闭包:如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。
*注:闭包条件:
(1)在一个外函数中定义了一个内函数
(2)内函数里运用了外函数的临时变量
(3)外函数的返回值是内函数的引用。
书中的例子:
假如有一份列表,其中的元素都是数字。现在要对其排序,要把出现在某个群组内的数字,放在群组外的数字之前。
实现该功能常见方法,是在调用列表的sort方法时,把辅助函数传给key参数。这个辅助函数的返回值,将会用来确定列表中各元素的顺序。辅助函数可以判断受测元素是否处在重要群组中,并据此返回相应的排序关键字(sort key)。
图片.png
升级版本1:改进sort_priority函数,令其返回一个值,用来表示用户界面里是否出现了优先级较高的元件,使得函数的调用者,可以根据这个返回值做出相应的处理。书中例子:
图片.png
通过这个例子可以发现,排序结果是对的,但是found值不对。numbers里面的某些数字确实包含在group中,可是函数却返回了False.原因何在?
在表达式中引用变量时,Python解释器将按如下顺序遍历各个作用域,以解析该引用:
1>当前函数的作用域
2>任何外围作用域(例如,包含当前函数的其他函数)
3>包含当前代码的那个模块的作用域(也叫做全局作用域,globa scope)
4>内置作用域(也就是包含len及str等函数的作用域)
如果上面这些地方都没有定义过名称相符的变量,那就抛出NameError异常。
**给变量赋值时,规则有所不同。如果当前作用域内已经定义了这个变量,那么该变量就会具备新值。若是当前作用域内没有这个变量,python则会把这次赋值视为对该变量的定义。而新定义的这个变量,其作用域是包含赋值操作的这个函数。
上面所说的这种赋值行为,可以解释sort_priority2函数的返回值错误的原因。将found变量赋值为True,是在helper闭包里进行的。于是,闭包中的这次赋值操作,就相当于在helper内定义了名为found的新变量,而不是sort_priority2中的那个found赋值。
***注:获取闭包内的数据
(1)python3
程序可以在闭包内用nonlocal语句来修饰某个名称,使该闭包能够修改外围作用域中的同名变量。如下:
图片.png
(2)python2
python2不支持nonlocal关键字;
程序可以使用可变值(例如包含单个元素的列表)来实现与nonlocal语句相仿的机制。如下:
图片.png
(3)除了比较简单的函数,尽量不要使用nonlocal语句。
好了,本回依旧是学习三条,具体内容还需要好好消化一下~~~
因为休了个假,所以停更了两周
现在继续学习起来!!!
加油!
网友评论