Effective Python:编写高质量的Python代码的59个有效方法(13-15)

  • 第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语句。


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容