第4章 分支与循环:控制程序的“交通灯”

写代码就像指挥交通。数据是车流,而分支和循环就是路口的红绿灯和环形匝道。没有它们,程序只能一条路走到黑——从第一行跑到最后一行,毫无波澜。今天我们就来聊聊,怎么让代码“动脑子”。

4.1 if判断语句:最简单的路口

if 语句,说白了就是“如果……就……”。这是程序做决策的最小单元。我个人习惯把 if 想象成一个安检员:条件成立,放行;不成立,拦下。

age = 18
if age >= 18:
    print("你可以考驾照了")

这里有个细节:Python 用缩进表示代码块。我见过不少新手在 if 后面忘了冒号,或者缩进不一致,结果程序直接报错。嗯,这几乎是每个初学者都会踩的坑。

注意:Python 的缩进必须是统一的空格或 Tab,混用会引发 IndentationError。我曾经在代码审查时看到有人混用了 4 个空格和 2 个空格,排查了半天才发现问题。

4.2 运算符:判断的“尺子”

if 后面跟的是条件,条件离不开运算符。常用的有这几类:

类型 运算符 示例
比较运算符 ==, !=, >, <, >=, <= 5 > 3 → True
逻辑运算符 and, or, not True and False → False
成员运算符 in, not in "a" in "abc" → True

你想想看,实际项目中很少只用单个条件。比如判断用户是否有权限:既要登录,又要角色是管理员。这时候 and 就派上用场了。

is_logged_in = True
role = "admin"
if is_logged_in and role == "admin":
    print("欢迎进入后台")
小技巧:写条件时,把变化可能性小的值放在左边。比如 if 18 <= age 不如 if age >= 18 读起来自然。这是代码可读性的细节,我一般会注意。

4.3 if-else 语句:两条路

if 只管“成立”的情况,那“不成立”呢?用 else。就像十字路口,绿灯走,红灯停,没有中间态。

score = 55
if score >= 60:
    print("及格了")
else:
    print("没及格,再努力")

如果条件不止两个,就用 elif。elif 是 else if 的缩写,Python 里没有 switch-case,全靠 elif 链搞定多分支。

score = 85
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"
print(f"你的等级是 {grade}")

我在项目中遇到过一种情况:多个 elif 的顺序搞反了,导致永远进不到后面的分支。比如先判断 score >= 80,再判断 score >= 90,那 95 分也会被归到 B 级。顺序很重要,切记。

4.4 while 循环:重复直到条件不满足

while 循环就像“一直做某事,直到某个条件不再成立”。它适合你不知道具体要循环多少次,但知道什么时候停的场景。

count = 0
while count < 5:
    print(f"第 {count+1} 次循环")
    count += 1

这里有个经典陷阱:死循环。如果你忘了写 count += 1,程序就会永远打印下去。我曾经在写网络重试逻辑时,忘记在成功时跳出循环,结果日志刷了十几万行。嗯,从那以后我写 while 都会先检查退出条件。

警告:while 循环一定要确保条件最终会变为 False,否则程序会卡死。可以用 Ctrl+C 强制终止,但这不是长久之计。

4.5 for 循环:遍历一切

for 循环是 Python 里最常用的循环。它用来遍历一个可迭代对象,比如列表、字符串、字典。说白了,就是“挨个处理”。

fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
    print(f"我喜欢吃 {fruit}")

for 循环配合 range() 函数,可以生成数字序列:

for i in range(5):  # 0 到 4
    print(i)

range(5) 生成 0,1,2,3,4,不包含 5。这是左闭右开区间。我刚开始学的时候总记混,后来就记住:range(n) 就是“从 0 到 n-1”。

提示:遍历字典时,用 for key, value in dict.items() 可以同时拿到键和值,比单独取 key 再查 value 效率高。

4.6 break:强行刹车

break 用来提前结束循环。不管循环条件是否还成立,遇到 break 就立刻跳出。

for i in range(10):
    if i == 5:
        break
    print(i)
# 输出:0 1 2 3 4

我在项目中常用 break 做“找到就停”的逻辑。比如搜索列表里第一个满足条件的元素,找到了就没必要继续遍历了,节省时间。

4.7 continue:跳过本次

continue 和 break 不同。break 是跳出整个循环,continue 只是跳过当前这一次,继续下一次。

for i in range(5):
    if i == 2:
        continue
    print(i)
# 输出:0 1 3 4

你想想看,这就像排队时有人临时离开,后面的人补上,队伍继续前进。continue 不会终止循环,只是“跳过当前元素”。

核心区别:break 是“不干了,全结束”;continue 是“这个算了,下一个”。

4.8 综合示例:猜数字游戏

把今天学的串起来,写个小游戏:

import random

target = random.randint(1, 100)
guess = None

while guess != target:
    guess = int(input("猜一个 1-100 之间的数字:"))
    if guess < target:
        print("小了")
    elif guess > target:
        print("大了")
    else:
        print("猜对了!")
        break

这个例子用到了 while 循环、if-elif-else、break。我在教新人时经常拿这个做练习,因为它覆盖了分支和循环的核心用法,而且有即时反馈,学起来不枯燥。

4.9 避坑指南

  • 忘记冒号:if、while、for 后面都要加冒号,漏了会报语法错误。
  • 缩进混乱:同一代码块必须用相同缩进,建议全程用 4 个空格。
  • 死循环:while 循环一定要确保条件能变为 False,或者用 break 控制退出。
  • 循环内修改迭代对象:遍历列表时不要增删元素,否则会出诡异 bug。我一般会复制一份再操作。

好了,分支和循环就聊到这儿。说白了,它们就是让代码“活起来”的关键。没有分支,程序就是死脑筋;没有循环,重复劳动能把你累死。下一章我们会聊函数,把代码打包成可复用的“积木”。到时候你会发现,有了分支和循环打底,写函数会顺手很多。