跳转至

5.1 程序结构——布尔逻辑

内容梗概

本课是“程序结构(控制语句)”系列的开篇,正式讲循环(for/while)和分支(if)之前,先讲所有控制语句都要用到的判断条件——布尔逻辑。内容包括:Python 中哪些值默认被判定为 False(None、数值 0、空序列/空集合)、and/or/not 三种逻辑运算及 and 与 or 的“短路”特性、数字和字符串的比较运算规则,以及 is 与 == 的区别(并用 is not None 演示了对函数返回值的异常排查)。课上还通过实际运行代码演示了字符串比较按 ASCII 码逐字符进行的底层逻辑。

知识点详解

真值检测:默认为 False 的值

  • 所有控制语句(if、while、for)的判断条件最终都要返回布尔值 True 或 False,这个判断过程叫逻辑值检测/真值检测 (约 01:00)。
  • 补充说明:之前讲数据类型时没单独讲 bool,因为 Python 的 bool 底层是用 int 实现的(类似 C 语言的宏定义),True/False 可当数字处理 (约 01:46)。
  • 默认为 False 的三类值 (约 01:38–03:10):
  • None:表示空对象;变量没存任何对象、或函数没有 return 返回值时,返回值就是 None(与 5.4 函数一节联动讲解)。
  • 数值类型的零:整数 0、浮点 0.0、复数 0j。
  • 空序列/空集合:空字符串、空元组、空列表、范围为空(如 range(0))等,只要为空就判为 False。

逻辑运算 and / or / not 与短路

  • 可用 and(与)、or(或)、not(非)组合布尔表达式得到新的逻辑值 (约 03:32)。
  • 短路运算 (约 06:54):or 的左侧表达式已为真时,右侧表达式不再计算;and 的左侧表达式已为假时,整个结果必为假,右侧也不再计算。这是为了节省计算资源。
  • not 运算:对表达式取反。Python 中用 not 关键字,作用与 C 语言的 ! 完全相同 (约 11:14)。老师举例:not 在文件/目录操作中很常用,如“先判断文件夹不存在(if not 存在)再创建”。

比较运算

  • 数字之间的比较运算符(<、<=、>、>=、==、!=)与数学一致 (约 13:40)。
  • 字符串比较 (约 14:38–17:48):
  • 单个字符比较:按对应 ASCII 码比较,如 'A'(65) > 'B'(66) 为 False。
  • 字符串比较:从左往右逐字符按 ASCII 码比大小,分出结果为止,与长度无关。示例:'ak...' 与 'as...' 比较时,第二位 k(107) < s(115),故前者大于后者为 False。
  • is 与 == 的区别 (约 18:17–20:29):
  • 老师提示这部分对当前进度“超纲”,会在讲对象时展开。
  • 结论先行:is 比较的是两个对象的 ID 是否相等,== 比较的是值是否相等;两者**不能混用**。
  • 使用规则:能直接比较的数据类型(数字等)用 ==;is 的典型用法是判断 is None / is not None。

用 is not None 做异常排查 (约 20:29–22:38)

  • 典型场景:v = func(),函数大多数情况下返回数字,极少数异常情况下返回 None。用 if v is not None: 包裹对 v 的处理(如 v += 1),可排除掉异常返回,是写程序时很重要的异常处理思路。

示例与演示

  • 短路演示 (约 08:30):设 x = 10, y = 100,判断 if (x < 50) or (y > 100):,因 x < 50 已成立,y > 100 不会被计算;换成 and 时左侧为假则右侧短路。建议给两侧表达式加括号看清“整体”。
  • 字符串比较演示 (约 14:38):分别运行 'A' > 'B' 和两个字符串的比较,现场查 ASCII 表(A=65, B=66, k=107, s=115)解释为什么结果都是 False。
  • is not None 伪代码示例 (约 20:29):定义一个偶尔返回 None 的函数,演示用 if v is not None: 进行保护性处理。

重点与难点

  • 牢记三类默认 False:None、数值 0、空序列/空集合,这直接决定 if/while 条件的走向。
  • and/or 的短路特性:左侧已能确定结果时右侧不执行——可用来“保护”后半段可能出错的表达式。
  • 字符串比较不是按长度,而是按 ASCII 码逐字符比较,这是容易想错的点。
  • is 与 == 不能混用:值比较用 ==,判断 None 用 is/is not None。

关联内容

  • 前置知识:数据类型(数值、字符串、列表)、切片等前几章内容。
  • 本课是分支语句(5.2)、循环语句(5.3)的基础,所有控制语句都依赖本课的判断条件。
  • None 与函数返回值的关系在 5.4 函数一节展开;is/对象 ID 的原理留到面向对象章节讲解;上节课作业(两字符取一段解码)已埋伏笔,将在 5.3 循环一节回顾。