第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章 分支与循环 · 知识体系 程序流程控制 分支结构 (if/elif/else) 循环结构 (while/for) 比较运算符 逻辑运算符 成员运算符 while 循环 for 循环 range() 函数 循环控制关键字 break continue 提示:分支决定「走哪条路」,循环决定「走多少遍」,break/continue 决定「中途怎么变」

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:精细控制循环的流程