第3章 流程控制
if 条件、for/while 循环、break/continue,以及列表推导式的入门写法。
本章学习目标
- 能写多分支 if-elif-else
- 能用 for 遍历序列、用 range 控制次数
- 能用 break/continue 控制循环
- 能写出简单的列表推导式
本章导览
核心内容
3.1
条件判断
程序的“岔路口”:if / elif / else,以及 match 分支(3.10+)。
能写单分支与多分支能正确使用缩进与冒号能写出嵌套条件的清晰版本
知识点
基本结构
- if 条件: 后面必须缩进;条件为真才执行该块。
- elif 可以有多个,按顺序判断,命中即跳出;else 兜底。
- Python 没有 switch 的老写法,3.10+ 提供了 match-case。
条件怎么写
- 比较、逻辑、成员(in)、身份(is None)都可以作为条件。
- 字符串比较按字典序;判断“非空”直接 if name: 即可。
- 复杂条件建议拆成有名字的变量,可读性比炫技重要。
嵌套与提前返回
- 嵌套超过两层就该考虑拆函数或提前 return。
- 函数里可以用 if 不满足就 return,减少缩进层级。
代码示例
▶ 成绩分档
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")👀 运行结果
良好
▶ match 分支
cmd = "add"
match cmd:
case "add":
print("新增")
case "del" | "delete":
print("删除")
case _:
print("未知命令")👀 运行结果
新增
常见错误
⚠️ 踩坑与解决
SyntaxError: expected ':'
→ if/elif/else 这一行末尾少了冒号;补上英文冒号条件永远不成立(字符串比数字)
→ input 得到的是字符串,和数字比大小;先 int() 转换
💡 if 里判断可为空的容器,直接写 if items:,比 if len(items) > 0: 更地道。
3.2
循环:for 与 while
重复的事交给循环:for 遍历序列,while 按条件重复。
能用 for 遍历列表/字符串/range能用 while 写不定次数循环能用 break/continue 控制流程
知识点
for 遍历
- for x in 序列: 一次取一个;for i in range(5) 循环 5 次(0~4)。
- range(start, stop, step) 可指定起止与步长,注意 stop 不含。
- enumerate 同时拿下标与值:for i, x in enumerate(items):
while 与死循环
- while 条件: 条件为真就一直循环,记得在循环里改条件变量。
- 死循环用 Ctrl+C 中断;调试时先 print 计数器。
break / continue / else
- break 跳出整个循环,continue 跳过本次。
- for-else:循环正常结束(没被 break)时执行 else,很有用。
代码示例
▶ 累加与遍历
total = 0
for i in range(1, 101):
total += i
print(total)👀 运行结果
5050
▶ while + continue
i = 0
while i < 5:
i += 1
if i % 2 == 0:
continue
print(i, end=" ")👀 运行结果
1 3 5
▶ for-else 找素数
n = 29
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
print("不是素数")
break
else:
print("是素数")👀 运行结果
是素数
常见错误
⚠️ 踩坑与解决
循环体没缩进
→ for 行下面直接写语句,没缩进;缩进 4 个空格死循环(程序卡住)
→ while 条件永远为真;检查条件变量是否在循环内更新,Ctrl+C 中断
💡 能确定次数就用 for,次数不确定(读文件、等输入)才用 while。
3.3
列表推导式与循环技巧
Python 最有辨识度的写法:一行完成“遍历 + 过滤 + 变换”。
能写基础列表推导式能加 if 过滤与 if-else 分支知道 zip / sum / max 等内置函数配合循环的用法
知识点
基础推导式
- [表达式 for 变量 in 序列] 一行生成列表。
- 等价于“建空列表 → 遍历 → append”,但更快更短。
加过滤与分支
- [x for x in nums if x % 2 == 0] 只保留偶数。
- [x * 2 if x > 0 else 0 for x in nums] 是 if-else 表达式(写在前面)。
- 字典/集合也有推导式:{k: v for k, v in items}。
常见配合
- zip(a, b) 把两个列表配对;sum/max/min/len 直接对容器统计。
- sorted(items, key=lambda x: x[1], reverse=True) 按第二列排序。
代码示例
▶ 过滤与变换
nums = [3, -1, 4, -5, 9]
squares = [n * n for n in nums if n > 0]
print(squares)👀 运行结果
[9, 16, 81]
▶ 字典推导式
words = ["a", "bb", "ccc"]
lengths = {w: len(w) for w in words}
print(lengths)👀 运行结果
{'a': 1, 'bb': 2, 'ccc': 3}▶ 排序取前三
students = [("张三", 89), ("李四", 92), ("王五", 78)]
top = sorted(students, key=lambda s: s[1], reverse=True)[:2]
print(top)👀 运行结果
[('李四', 92), ('张三', 89)]常见错误
⚠️ 踩坑与解决
推导式里写了多步逻辑
→ 把 if/for 混在一起难读;超过一个条件就改回 for 循环[x*2 for x in nums if x>0 else 0] 语法错误
→ if-else 不能直接跟在 for 后面;写成 [x*2 if x>0 else 0 for x in nums]
💡 推导式只做“一眼能看懂”的变换;复杂逻辑写成普通循环,可读性优先。