好冷的Python~条件语句的短路原则

原文链接:http://www.juzicode.com/archives/5258

桔子菌小时候看到小伙伴用电池和灯泡做了个手电筒,也找来材料依葫芦画瓢做了一个,但是因为没有找到开关,就只能用断开接线的方式关闭手电筒。有一次突然发现把电池的2头短接起来也能关闭手电筒,桔子菌为了这个发现兴奋不已,可是时间久了我的小手电就点不亮了,还一度以为小灯泡坏了。

你可能会奇怪,我们是来聊Python的,怎么说到桔子菌小时候的事情了。

言归正传,先看一段条件语句的代码,眼尖的你可能看到这里b并没有定义或赋值就进行判断b==1,应该会抛出NameError异常:

#VX公众号:桔子code / juzicode.com
a = 1
if a == 1 or b == 1:
    print('a和b都为1')
else:
    print('a或b不为1')

但是运行结果是这样的:

a和b都为1

我感觉被耍了

为什么会这样,居然运行良好并没有抛出异常?

从上面的代码运行结果来看,我们只定义了a=1,b并没有赋值,但是仍然执行了到if下面的语句中,按道理b没有赋值在判断完a==1后再判断b==1的时候应该要抛异常的。

接下来我们将a的值做下修改,将a的值赋值为0,再来看下效果:

#VX公众号:桔子code / juzicode.com
a = 0
if a == 1 or b == 1:
    print('a和b都为1')
else:
    print('a或b不为1')

运行结果:

这个时候因为a==1的条件不满足,结果为Flase,再运行到了判断b==1,因为b没有定义过,所以抛NameError异常了。

前面看了or语句,我们再来看下and语句。

#VX公众号:桔子code / juzicode.com
a = 1
if a == 1 and b == 1:
    print('a和b都为1')
else:
    print('a或b不为1')

运行结果:

这里a==1的条件满足,结果为True,所以继续判断b==1,但是因为b没有定义就进行了判断,所以导致抛NameError异常。

如果再将a的赋值为0,会是什么效果呢:

#VX公众号:桔子code / juzicode.com
a = 0
if a == 1 and b == 1:
    print('a和b都为1')
else:
    print('a或b不为1')

运行结果:

a或b不为1

这里因为a为0,不满足a==1的条件,所以a==1的结果为False,不再继续判断b==1,这时就不再抛异常了。

上述这种现象就是Python里的“短路原则”:在条件语句中,如果存在多个条件需要判断时,位置靠前的条件导致整个判断语句为True(or语句)或者为False(and语句),就不再进行后续条件的判断。

了解了Python的短路原则,我们平常在”写bug”的时候要注意些什么呢?在写代码、走读代码的时候需要仔细检查所有的条件语句,避免出现前面例子中的情况,不生产问题;另外就是在做单元测试的时候需要覆盖到所有的条件和分支,提前暴露问题。

原文链接:http://www.juzicode.com/archives/5258

扩展阅读:

  1. Python基础教程5–流程控制-条件语句
  2. Python基础教程5b–流程控制-循环语句

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注