2.4.2 逻辑运算

仅用简单布尔表达式是不够的,复杂条件需要用复杂布尔表达式来描述。将多个简单布 尔表达式用逻辑运算符联结起来,即可构成复杂布尔表达式。Python 语言支持的逻辑运算 符有三个:and、or 和 not。

逻辑运算符 and

逻辑运算符 and 联结两个布尔表达式,并得到一个新的布尔表达式。形如:

  1. <布尔表达式 1> and <布尔表达式 2>

新表达式的值依赖于参加 and 运算的两个布尔表达式的值。具体的依赖关系可以用一个真值表来定义(表 2.6):

2.4.2 逻辑运算 - 图1

表 2.6 逻辑运算符 and 的真值表

在表 2.4 中,P 和 Q 表示参加运算的布尔表达式,P and Q 是新的布尔表达式。由于 P 和 Q 各有两种可能的值,所以 P、Q 组合共有四种可能的值组合,每种组合在表中用一行表示。 最后一列就是对应于每种组合的 P and Q 的值。从表中可知,P and Q 为真当且仅当 P 为真并且 Q 为真,这也正是 and(并且)的含义。例如:

  1. >>> (3 > 2) and (2 > 1)
  2. True
  3. >>> (3 > 2) and (2 > 3)
  4. False

顺便说一下,Python 语言允许一种独特的比较表达式形式,该形式在其他编程语言中 是不允许的。请看下例:

  1. >>> 3 > 2 > 1
  2. True
  3. >>> 3 >; 2 > 4
  4. False

由于这种连续比较的形式在数学中常用,所以初学者很容易接受。但我们不建议读者使 用这种比较形式,因为这种形式毕竟不为绝大多数编程语言所接受。对于复合条件,还是使 用逻辑运算符 and 来表达为好。

逻辑运算符 or

逻辑运算符 or 联结两个布尔表达式,并得到一个新的布尔表达式。形如:

  1. <布尔表达式 1> or <布尔表达式 2>

新表达式的值依赖于参加 or 运算的两个布尔表达式的值。具体的依赖关系可以用真值表来定义(表 2.7):

2.4.2 逻辑运算 - 图2

表 2.7 逻辑运算符 or 的真值表

从表 2.5 可知,P or Q 为假当且仅当 P 为假并且 Q 为假。也就是说,P 和 Q 只要有一个为真,P or Q 就为真,这大体上就是 or(或者)的含义。例如:

  1. >>> (3 > 2) or (3 <= 2)
  2. True
  3. >>> (2 > 3) or (2 > 4)
  4. False

要注意的是,虽然 or 大体上相当于自然语言中的“或者”,但还是有细微差别的。从 表 2.5 可见,当 P 和 Q 都为真时,P or Q 也为真。而在日常生活中如果说“P 或者 Q”,一 般意味着 P 和 Q 只有一个为真,即有互斥的意义。鱼或熊掌,不可兼得。

逻辑运算符 not

与 and、or 不同,逻辑运算符 not 是对单一布尔表达式进行否定操作,也称为单目运 算符。用法如下:

  1. not <布尔表达式>

2.4.2 逻辑运算 - 图3

新表达式的值仍可用真值表定义,见表 2.8:

表 2.8 逻辑运算符 not 的真值表 逻辑运算符 not 比较简单,用例如下:

  1. >>> not 3 > 2
  2. False
  3. >>> not not 3 > 2
  4. True

后面一个语句相当于我们生活中说的双重否定变肯定。 利用三个逻辑运算符可以构造任意复杂的布尔表达式。当复杂布尔表达式中存在多个逻辑运算符的时候,哪个先计算、哪个后计算就成了问题。同算术运算符一样,逻辑运算符也 定义了优先级,复杂表达式的求值依赖于运算符的优先级规则。例如,考虑下列表达式该如 何计算:

  1. a or not b and c

在 Python 语言中,为逻辑运算符定义的优先级次序是:not > and > or。因此上面的 表达式等价于下面这个加括号的形式:

  1. (a or ((not b) and c))

其实,与其背诵优先级规则,不如多用括号来明显地指定计算次序。这对程序员来说不但可以减轻记忆负担,更重要的是增强了代码的可读性。 下面看一个例子。设两个乒乓球运动员 A 和 B 打比赛,a 和 b 分别表示两人的得分。

根据规则,一局比赛结束的条件是:A 得到 11 分或者 B 得到 11 分。这个条件可以表示为下列布尔表达式:

  1. a == 11 or b == 11

当任一运动员得到 11 分,就导致表达式中的一个简单条件为真,根据 or 的定义,整个表 达式也就为真。或者反过来表达,如果还没有满足上述条件,就继续比赛。因此继续比赛的 条件就是:

  1. not (a == 11 or b == 11)

实际上,乒乓球比赛规则还要复杂一点。当 A 和 B 打到 10 平,规则规定先多得两分者 获胜。将这一特殊情形考虑进去,并结合上面的普通情形,可将结束条件表达为:

  1. (a >= 11 and a - b >= 2) or (b >= 11 and b - a >= 2)

其含义是:任一方得分达到 11 分以上,并且领先另一人 2 分以上,则一局比赛结束。 这个条件可以稍加简化,即如

  1. (a &gt;= 11 or b &gt;= 11) and abs(a - b) &gt;= 2

其含义是:当任一方得分达到 11 分以上,并且两人分差超过 2,则一局比赛结束。