Python学习笔记--条件分支控制流

发布时间:2024年01月24日

本文摘自朱雷老师所著《Python工匠》一书内容,作为笔记予以记录。

《Python工匠》第四章讲解“条件分支控制流”,讲到不要显式地和空值做比较,和None做相等判断时使用is运算符等,对于我这样菜鸟,还是很受益的。

错综复杂的分支语句,让很多代码变得难以维护。可以转化一下思路,那些恼人的if/else分支也许可以被其它东西替代。当代码中的分支越少、分支越扁平、分支的判断条件越简单,代码就越容易为何。

一、Python工匠》第四章总结内容

(1)条件分支语句惯用写法

  • 不要显式地和布尔值做比较
  • 利用类型本身的布尔值规则,省略零值判断
  • 把not代表的否定逻辑移入表达式内部
  • 仅在需要判断某个对象是否是None、True、False时,使用is运算符(其它用==比较)

(2)Python数据模型

  • 定义_ _len_ _和 _ _bool_ _魔法方法,可以自定义对象的布尔值规则
  • 定义_ _eq_ _ 方法,可以修改对象在进行==运算时的行为

(3)代码可读性技巧

  • 不同分支内容出现重复或类似的代码,把它们抽到分支外可提升代码的可读性
  • 使用“德摩根定律”可以让更多重否定的表达式变得更容易理解

(4)代码可维护性技巧

  • 尽可能让三元表达式保持简单
  • 扁平优于嵌套:使用“提前返回”优化代码里的多层分支嵌套
  • 当条件表达式变得特别复杂时,可以尝试封装新的函数和方法来简化
  • and的优先级比or高,不要忘记使用括号来让逻辑更清晰
  • 在使用or运算符替代条件分支时,请注意避开因布尔值运算导致的陷阱

(5)代码的组织技巧

  • bisect模块可以用来优化范围类分支判断
  • 字典类型可以用来替代简单的条件分支语句
  • 尝试总结条件分支代码里的规律,用更精简、更容易扩展的方法改写它们
  • 使用any()和all()内置函数可以让条件表达式变得更精简

二、重要知识点与技巧

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,或空列表、空字典

??? ...

  • 布尔值为假:None、0、False、[] 、{} 、() 、set() 、frozenset(),等等
  • 布尔值为真:非0的数值、True、非空的列表、元组、字典、集合,用户定义的类和实例,等

(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)的结果是否相等,二者是否是同一个对象。

文章来源:https://blog.csdn.net/2303_79232676/article/details/135814193
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。