分支和循环:控制代码的执行流

写代码说白了就是一件事:让程序按你的想法走。但现实世界哪有那么多「一路走到黑」的情况?你得做选择,得重复做某件事直到条件满足。这就是分支和循环要干的事。

我刚开始学 Python 那会儿,觉得这俩东西太简单了——不就是 if 和 for 嘛。后来做项目才意识到,控流写不好,Bug 能让你找一宿。今天咱们就把这块彻底捋清楚。

1. if 判断语句:让代码会「思考」

判断是编程最基本的能力。给定一个条件,True 就走一个分支,False 就走另一个。语法很直白:

age = 18
if age >= 18:
    print("你可以看电影了")

注意那个冒号,别漏了。还有缩进——Python 用缩进表示代码块,不要用 Tab 混空格,我吃过这个亏,写了个大半天排查发现是缩进不一致。

个人习惯:我每次写 if 都会先问自己「条件会不会有边界值撞上?」,比如 age == 18 的情况是不是归到 >= 这一边?想清楚再下笔。

2. 逻辑运算符:组合条件的好帮手

一个条件不够用?用 and、or、not 把它们串起来。举个例子:判断一个年份是不是闰年——能被 4 整除但不能被 100 整除,或者能被 400 整除。

year = 2024
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
    print("闰年")
else:
    print("平年")

逻辑运算符的优先级是 not > and > or,我建议不确定的时候就加括号,别省那一个字符,可读性比什么都重要。你想想看,三个月后回来看代码,括号能帮你省三分钟。

我个人经常踩的坑:在 and 和 or 混合时忘加括号,结果条件判断完全不对。记住,优先级不是记出来的,是括号保护出来的。

3. if-elif-else:多路分支

现实判断往往不止两个结果。成绩评级、用户权限、菜单选择……用 if-elif-else 搞定:

score = 85
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"
print(grade)

注意 elif 是 else if 的缩写。我最初写的时候老写成 else if,直接报语法错误。别犯这种低级错哈。

还有一点:Python 里没有 switch-case,别找了。if-elif-else 就是你的主力,写多了你会发现它比 switch 还灵活。

if-elif-else 执行规则
条件顺序执行结果
第一个 True 的条件执行对应的代码块,然后跳出整条链
所有条件都是 False执行 else 块(如果有的话)
多个 True 条件只执行最先匹配的那个

我曾经在项目中把最严格的条件放在 elif 最后面,导致数据筛选全错了。记住:条件顺序决定逻辑,把最具体的条件放最前面。

4. while 循环:不知道循环次数时用

while 按条件重复执行,直到条件变为 False。典型的用法是“不知道什么时候结束,但知道什么时候继续”。比如猜数字游戏:

secret = 42
guess = None
while guess != secret:
    guess = int(input("猜一个数字:"))
    if guess < secret:
        print("小了")
    elif guess > secret:
        print("大了")
print("猜对了!")

while 循环最怕什么?条件永远不变,导致死循环。我见过线上服务因为 while True 里面忘记 break 而跑满 CPU,赶紧加上退出机制。

写 while 时养成习惯:先想「什么时候退出」,再写循环体。可以在循环开头加一个计数器限制最大次数,防止意外死循环。

5. for 循环:遍历序列的第一选择

for 循环在 Python 里特别好用,因为它直接遍历迭代器,不需要下标。遍历列表、字符串、字典都行:

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

如果需要索引,用 enumerate:

for i, fruit in enumerate(fruits):
    print(f"第{i+1}个水果是{fruit}")

range() 是 for 循环的老搭档,生成整数序列:range(5) 生成 0,1,2,3,4。range(1,10,2) 生成 1,3,5,7,9。

我个人倾向在循环体不要太长,超过十行的循环就该考虑拆成函数了。你想想看,一个循环里塞几十行逻辑,调试的时候心态会崩。

6. break 和 continue:循环的控制杆

有时候需要在循环中间提前退出,或者跳过某次迭代。break 和 continue 就是干这个的。

  • break:立即跳出整个循环,不再执行剩余迭代。
  • continue:跳过本次循环剩余语句,直接进入下一次迭代。
# 找第一个能被3整除的数
numbers = [1, 4, 6, 8, 9]
for n in numbers:
    if n % 3 == 0:
        print(f"找到了:{n}")
        break    # 找到后就不再往后找了

# 跳过所有偶数
for n in numbers:
    if n % 2 == 0:
        continue # 偶数不处理
    print(f"奇数:{n}")

我曾经在嵌套循环里用了 break,结果只跳出了内层循环,外层还在跑,导致逻辑错了很久才发现。记住:break 只跳出当前最内层循环,想跳出多层可以用标志变量或者把逻辑封装成函数用 return。

知识体系总览

分支与循环知识体系 分支(条件判断) if 逻辑运算符 and / or / not if-elif-else 多路分支,顺序匹配 嵌套判断 if 里面再套 if 条件表达式(三目) x if True else y 循环(重复执行) while for range() / enumerate() 配合 for 使用 break 跳出整个循环 continue 跳过当前迭代

上面这张图把分支和循环的知识点全串起来了。左边是判断相关,右边是循环相关。注意看 break 和 continue 是挂在 for/while 下面的——它们不能单独使用,必须配合循环。

实战:综合练手

把所学串起来,写一个「密码尝试系统」,最多试 3 次:

correct_pwd = "python123"
max_attempts = 3

for attempt in range(1, max_attempts + 1):
    pwd = input("请输入密码:")
    if pwd == correct_pwd:
        print("登录成功!")
        break
    else:
        remaining = max_attempts - attempt
        if remaining > 0:
            print(f"密码错误,还剩{remaining}次机会")
        else:
            print("密码错误,账号已锁定")

这个例子包含了 for、if-else、break,逻辑清楚。在真实项目中,我经常把这种模式用在登录、支付验证、重试机制里。

写分支循环最核心的原则:先想清楚条件逻辑,再动键盘。画个流程图或者写个伪代码,比自己瞎猜强十倍。我每次写复杂循环之前,习惯先在纸上画一遍流程,跑通了再写代码,省去大量调试时间。

好,这一章的核心就这些。分支和循环是编程的骨架,以后每段稍微复杂的代码都离不开它们。多练几次,你会发现这些模式其实还挺固定的。