本文摘自朱雷老师所著《Python工匠》一书内容,作为笔记予以记录。
《Python工匠》第四章讲解“条件分支控制流”,讲到不要显式地和空值做比较,和None做相等判断时使用is运算符等,对于我这样菜鸟,还是很受益的。
错综复杂的分支语句,让很多代码变得难以维护。可以转化一下思路,那些恼人的if/else分支也许可以被其它东西替代。当代码中的分支越少、分支越扁平、分支的判断条件越简单,代码就越容易为何。
一、Python工匠》第四章总结内容
(1)条件分支语句惯用写法
(2)Python数据模型
(3)代码可读性技巧
(4)代码可维护性技巧
(5)代码的组织技巧
二、重要知识点与技巧
1、基础知识
(1)省略零值判断
编写if分支时,如果需要判断某个类型的对象是否是零值,可能如下写:
if containers_count == 0:?? # if? containers_count != []
??? ...
当某个对象作为主角出现在if分支语句里时,Python解释器会主动对它进行“真假测试”,也就是调用bool()函数获取它的布尔值。而在计算布尔值时,每类对象都有各自的规则,比如整型0的布尔值为False,其它都为True;空列表、字典的布尔值为False,其它为True。
所以,当我们需要在条件语句里做空值判断时,可以直接吧代码简写成如下:
if not containers_count:?? #? containers_count对象无论是数值0,或空列表、空字典
??? ...
(2)把否定逻辑移入表达式内
if not number? < 10:? # 解释器会1)先做number < 10 比较运算,2)not 运算 ,3)bool测试运算
??? ...
推荐修改为:
if number? >= 10 :??? # 解释器会1)先做number < 10 比较运算,3)bool测试运算
??? ...
(3)与None比较时使用is运算符
当我们需要判断两个对象是否相等时,通常会使用双等号==运算符,它会对比两个值是否一致,然后返回一个布尔值结果,但是对于自定义对象来说,它们在进行==运算时行为是可以操纵的:只要在自定义类型的_ _eq_ _魔法方法就行。
class EqualWithAnything:
"""与任何对象相等"""
def __eq__(self,other)
# 方法里的other参数代表 == 操作时右边的对象,比如
# x == y 会调用x的__eq__方法,other的参数为y
return True
上面定义的EqulWithAnything对象,在和任何东西通过==运算符做比较,会执行_ _eq_ _方法,总是返回True。所以如何严格检查某个对象是否为None呢?答案是使用is运算符。
==运算符对比两个对象是否相等,行为可被_ _eq_ _方法重载
is运算符判断两个对象是否是内存里的同一个东西,无法被重载
换句话说,当执行 x is y时,Python解释器是判断id(x)和id(y)的结果是否相等,二者是否是同一个对象。