第4章 分支与循环:让程序学会“思考”和“重复”
写代码最核心的两件事是什么?我个人觉得,一是做判断,二是重复做。你想想看,现实中的业务逻辑,哪个不是「如果这样,就那样;否则就换一种」?哪个不是「把这件事重复100遍」?
这一章,我们就来搞定 Python 里的分支和循环。说白了,就是让程序学会自己拿主意,并且能任劳任怨地干重复的活。
4.1 if 判断语句:程序的第一颗“大脑”
if 语句,是让程序产生分支的起点。它的语法很简单:
if 条件:
条件成立时执行的代码
注意那个冒号 :,还有缩进。Python 用缩进来表示代码块,这是它的铁律。我刚开始学的时候,经常忘记冒号,或者缩进用了空格和 Tab 混搭,结果程序直接报错。嗯,这里要注意:统一用4个空格,别用 Tab。
核心要点: if 后面的条件,本质上是一个布尔表达式。只要结果是 True,就执行缩进块里的代码。
4.2 运算符:构建条件的“砖块”
光有 if 还不够,你得会写条件。条件由运算符组成。我把它分成三类:
| 类型 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 比较运算符 | == != > < >= <= | 比大小、比相等 | age >= 18 |
| 逻辑运算符 | and or not | 组合多个条件 | age >= 18 and score >= 60 |
| 成员运算符 | in not in | 判断是否在容器里 | 'admin' in user_list |
我在项目中遇到过一个问题:新手容易把 =(赋值)和 ==(判断相等)搞混。写 if 的时候,一不留神就写成了 if x = 10,这在 Python 里会直接报语法错误。记住:判断相等用两个等号。
小技巧: 逻辑运算符 and 和 or 有短路特性。比如 a and b,如果 a 是 False,Python 就不会再去算 b 了。利用这个特性,可以写出更高效的代码。
4.3 if-else 语句:两条路,选一条
if 只能处理「成立时做什么」,那「不成立时做什么」呢?用 else。
age = 16
if age >= 18:
print("你可以投票")
else:
print("你还不能投票")
如果条件不止两个分支呢?用 elif(else if 的缩写)。
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
我曾经在一个自动化脚本里,用 elif 写了7层判断,后来自己都看晕了。我的建议是:超过3层 elif,考虑用字典映射或者策略模式,别硬堆。
避坑指南: 我曾经在写 if-elif 时,把条件顺序搞反了。比如先判断 score >= 60,再判断 score >= 90,结果90分的人先被第一个条件拦截,永远走不到第二个分支。记住:范围条件要从窄到宽,或者从高到低。
4.4 while 循环:只要条件为真,就一直干
循环,就是让一段代码反复执行。while 循环的格式:
while 条件:
循环体代码
只要条件为 True,循环体就会一直执行。所以,你得在循环体里想办法让条件最终变成 False,否则就是死循环。
count = 0
while count < 5:
print(f"第 {count+1} 次循环")
count += 1 # 别忘了这一行
我调试过一个线上问题:一个 while 循环里忘了写 count += 1,结果服务器 CPU 直接飙到100%。嗯,死循环在开发时是工具,在生产环境就是灾难。
核心要点: while 循环适合「不知道要循环多少次」的场景,比如等待用户输入、轮询某个状态。
4.5 for 循环:遍历一切可遍历的东西
for 循环是 Python 里最常用的循环。它的设计哲学是「遍历」——把一个序列里的元素挨个拿出来用。
fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
print(f"我喜欢吃 {fruit}")
配合 range() 函数,可以生成数字序列:
for i in range(5): # 0,1,2,3,4
print(i)
for i in range(2, 8): # 2,3,4,5,6,7
print(i)
for i in range(0, 10, 2): # 0,2,4,6,8
print(i)
我个人习惯用 for 循环多于 while 循环。为什么?因为 for 循环自带「边界感」,你明确知道它要遍历多少个元素,不容易写出死循环。
小技巧: 遍历字典时,可以用 for key, value in dict.items(): 同时拿到键和值,比单独取 key 再查 value 效率高。
4.6 break 和 continue:循环的“刹车”与“跳过”
有时候,你需要在循环中途改变流程。两个关键字:
- break:立即跳出整个循环,不再执行后续的循环。
- continue:跳过本次循环的剩余代码,直接进入下一次循环。
# break 示例:找到第一个偶数就停
numbers = [1, 3, 5, 8, 9, 10]
for n in numbers:
if n % 2 == 0:
print(f"找到偶数: {n}")
break
# continue 示例:跳过所有奇数
for n in range(10):
if n % 2 != 0:
continue
print(f"偶数: {n}")
我曾经在一个数据处理脚本里,用 continue 跳过了所有空值和异常值,只处理有效数据。代码看起来干净多了。
避坑指南: break 只跳出它所在的最内层循环。如果你有两层嵌套循环,break 只跳出内层,外层继续跑。我曾经因为这个 bug 多查了两小时。如果需要跳出多层,可以考虑用标志变量或者把循环封装成函数用 return。
4.7 知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作一张「思维地图」。
4.8 实战组合:用循环和分支处理数据
光说不练假把式。我们写一个综合小例子:从一个学生成绩列表里,找出所有及格的学生,并计算他们的平均分。
scores = [55, 78, 92, 43, 88, 67, 30, 95]
pass_scores = []
for score in scores:
if score >= 60:
pass_scores.append(score)
if pass_scores:
avg = sum(pass_scores) / len(pass_scores)
print(f"及格人数: {len(pass_scores)}")
print(f"及格平均分: {avg:.1f}")
else:
print("没有人及格")
这个例子虽然简单,但它包含了本章的几乎所有核心知识点:for 循环遍历列表、if 判断条件、列表追加、以及最后的 if-else 输出。你想想看,实际工作中的数据处理,本质上不就是这些操作的组合吗?
小技巧: 上面的代码可以用列表推导式简化成一行:pass_scores = [s for s in scores if s >= 60]。不过初学者先掌握基础写法,推导式后面会专门讲。
4.9 本章小结
这一章我们搞定了四件事:
- if 判断:让程序根据条件走不同分支
- 运算符:构建条件的工具(比较、逻辑、成员)
- while 和 for 循环:让代码重复执行,一个适合未知次数,一个适合遍历序列
- break 和 continue:精细控制循环的流程