逻辑嵌套
一个真假判断里再放判断;合在一起仍然只是一个路口,不会多出一层缩进。
它是什么
逻辑嵌套 是把若干真假判断套进一个条件里。运算符 and、or、not 负责组合,括号标明组合管到哪里。组合完了,选择 看到的仍是一个真或一个假,不会因为条件变长就多出一层 缩进。
合取(并且)与析取(或者)保护的不是同一件事。下限以上并且上限以下,才算落在量程里;改成「碰到任一端就算」,覆盖的情形就换了。嵌套的是判断,不是代码块。
reading = 21.5
low = 0.0
high = 50.0
valid = reading >= low and reading <= high
print(valid)名字从哪来
这种组合来自布尔代数。乔治·布尔在 19 世纪把真和假做成可以运算的对象:合取、析取、否定,以及把它们再套进彼此。同一时期,奥古斯塔斯·德摩根写清了一条容易看反的对应——「不是(A 并且 B)」等于「(不是 A)或者(不是 B)」。括号在这里不是礼貌,它决定否定和连接各管哪一段,就像算式里的括号决定先算哪一步。
它怎么工作
not 的范围只到它紧挨着的那一个判断,除非括号把它扩大。not a and b 先否定 a,再与 b 合取;not (a and b) 才是否定整句合取。and 比 or 更先结合,这和乘法先于加法类似。不写括号时,解释器仍会按这个顺序组合,只是人更容易看错。
has_ticket = True
balance_ok = False
monthly = True
open_gate = has_ticket and (balance_ok or monthly)
print(open_gate)有票,并且(余额够或者持有月票),闸门才开。括号里的析取先合成一个真假,再与「有票」合取。拿掉括号,and 比 or 先结合,整句变成「(有票并且余额够)或者持有月票」:没有票、只持月票,也会被放行。
Python 还会短路:and 的左边已经为假,右边不再计算;or 的左边已经为真,右边也不再计算。右边若可能失败,它是否发生,取决于左边已经说出的答案。见 运算符。
生活里在哪里
进站闸机先要认得出这张卡,并且余额够这次车费。两条都成立才开门;写成「认得出或者余额够」,缺其中一条也会被放行。实验室的量程同样是合取:读数不低于下限,并且不高于上限。门禁、药量、年龄区间,凡是「必须同时满足」的规则,都是判断套判断,而不是多走一层手续。
和相近概念的差别
逻辑嵌套不增加代码块。代码嵌套 是 if 里面再写 if,缩进变深;外层为假,内层整块不执行。相近的规则有时可以写成两层选择,有时写成一个带 and 的条件。写成一层时,失败的原因被合成了一个真假;写成两层时,每一问仍然单独可见。该用哪一种,取决于后来还需不需要分辨「是哪一条没通过」。
运算符 是用来组合的符号。逻辑嵌套是这些符号套在一起之后的那一句判断。比较得到真假;and、or、not 再把真假套成新的真假。
常见误会
误会 1:not a and b 表示「a 和 b 都不成立」。
not 只否定紧挨着的 a。要否定整句,写成 not (a and b)。它和「两边各自否定再合取」也不是同一句话。
误会 2:and 和 or 可以互换,只要句子里「有逻辑」。
换了,被保护的情形就换了。量程从「必须同时满足上下限」变成「碰到任一端就算数」,通过的读数完全不同。
误会 3:条件里加了括号或 and,程序就会多走一层缩进。
不会。缩进只标记代码块,不标记判断内部的组合。逻辑上套了三层,选择结构仍然只有一个路口。
想知道更多
- 书:布鲁克希尔《计算机科学概论》
- 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》
- 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》
未登录时不会保存学习进度