美文网首页生物信息编程
Effective Python:编写高质量的Python代码的

Effective Python:编写高质量的Python代码的

作者: renailin | 来源:发表于2019-08-18 11:21 被阅读2次
    • 第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语句。


    好了,本回依旧是学习三条,具体内容还需要好好消化一下~~~
    因为休了个假,所以停更了两周
    现在继续学习起来!!!
    加油!

    相关文章

      网友评论

        本文标题:Effective Python:编写高质量的Python代码的

        本文链接:https://www.haomeiwen.com/subject/gojtsctx.html