程序员入伙书——并且、或者、不是、真真假假
- 2012年12月27日
在上一章介绍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就更要不得了。
猛击阅读全文