逻辑运算符 and

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

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

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

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

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

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

    1. >>> 3 > 2 > 1
    2. False

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

    逻辑运算符 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(或者)的含义。例如:

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

    逻辑运算符 not

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

    1. not <布尔表达式>

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

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

    1. >>> not 3 > 2
    2. True

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

    1. a or not b and c

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

    其实,与其背诵优先级规则,不如多用括号来明显地指定计算次序。这对程序员来说不但可以减轻记忆负担,更重要的是增强了代码的可读性。 下面看一个例子。设两个乒乓球运动员 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 平,规则规定先多得两分者 获胜。将这一特殊情形考虑进去,并结合上面的普通情形,可将结束条件表达为:

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