程序员入伙书——并且、或者、不是、真真假假
- 2012年12月27日
- 发布在 infotech . on my mind
- 留下评论
在上一章介绍if-else时,我在结尾举了个程序优化的例子,里面用到了一个词:and,我答应会细细讲到它,现在这个章节就是。
if-else的执行过程是这样的:比如语句是if a > 3,那么它就会看,a大于3吗?如果a的当前值等于4,那么4 > 3这个表达式就会算出一个“真”值,if a > 3就成了if True。程序看到了if True,就决定执行这段程序。如果a等于2,它就会最终看到if False(“假”值),if False的结果就是使程序跳过这段代码,转而执行下一个判断。
做个实验,这个实验证明if True所对应的程序段会无条件执行,而if False所对应的,则铁定不执行:
>>> if True: print("I am in the True block") I am in the True block >>> if False: print("I am in the False block") >>>
True的意思是“真”,False的意思是“假”。数学上说的真命题、假命题,和这两个概念等价。
不是所有的条件判断都是a > 3这么简单的,有时需要把几个条件组合起来。例如“晚上如果停电,我就点蜡烛”这句话,等同于“如果到了晚上,并且停电,我就点蜡烛。”只有“晚上”和“停电”同时满足时,才会引起点蜡烛的动作。而如果是大白天、或者有电、或者既是大白天又有电,那就没必要点蜡烛了。“他夫妻俩都去,我就去”的意思是“他去,并且她去,我就去。”如果这小两口有一位不出席,我就未必去。
这个表达“两个条件同时满足,才能得到True”的词:“并且”,在Python里被写为and。and两边的值必须同时为True,才能得到True的结果,否则结果是False。
>>> True and True True >>> True and False False >>> False and True False >>> False and False False >>>
and对条件要求相当苛刻,相当于给了所有投票者一票否决权。另有一种要求不那么苛刻的,只要有一个投了赞成票,就绿灯放行。这种运算叫做“或者”,Python里写作or。
“两个人有一个好的,这架就打不起来。”这话的逻辑就是or。意思是说,如果张麻子是好的or王二狗是好的,甚至两个人都是好的,就不会打得头破血流。
1971年,副统帅说想动一动,周丞相说,如果想动一动,需要周、黄、吴、李四人同时下令。但李是副统帅家的人,把这话解释为,只要周黄吴李中有人下令,就可以动。于是山海关的那架三叉戟就动了,动静还挺大。
这个例子,就是本来应该用and的地方写了or,原本是“周同意 and 黄同意 and 吴同意 and 李同意”变成了“周同意 or 黄同意 or 吴同意 or 李同意”。把and和or用错,很多老程序员都可能会犯。众所周知,那架三叉戟后来掉下来了。这个故事告诉我们:and和or千万不能弄反,故意制造Bug就更要不得了。
>>> True or True True >>> True or False True >>> False or True True >>> False or False False >>>
对于还不太熟悉逻辑世界规则的同学,你可以把and想成数学的乘法,or想成加法,把True想成1或者任何正数,把False想成0。上面的这些规则就好记多了。
最后要介绍的,是“不是”操作,很简单很直接。如果是True的,翻转成False,如果是False的,翻转为True。实验如下:
>>> not True False >>> not False True >>>
在计算机术语里,“并且”被称为“与”,“或者”被称为“或”,“不是”被称为“非”。这些也是数理逻辑里的标准用词。
Python语言里,如果没有括号干预,首先计算not,然后是and,最后处理or。
在实际的编程应用时,有时需要简化逻辑表达式,使它们看起来不那么冗长。下面的四个等价关系是最常用的,家居旅行必备,且已经从数学上被证明,请放心使用。
(A and B) or (A and C) 等价 A and (B or C)
(not A) and (not B) 等价 not (A or B)
(not A) or (not B) 等价 not (A and B)
A or ((not A) and B) 等价 A or B
九一三事件的那个例子好。