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 循环一节回顾。