分支和循环:控制代码的执行流
写代码说白了就是一件事:让程序按你的想法走。但现实世界哪有那么多「一路走到黑」的情况?你得做选择,得重复做某件事直到条件满足。这就是分支和循环要干的事。
我刚开始学 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 还灵活。
| 条件顺序 | 执行结果 |
|---|---|
| 第一个 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。
知识体系总览
上面这张图把分支和循环的知识点全串起来了。左边是判断相关,右边是循环相关。注意看 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,逻辑清楚。在真实项目中,我经常把这种模式用在登录、支付验证、重试机制里。
写分支循环最核心的原则:先想清楚条件逻辑,再动键盘。画个流程图或者写个伪代码,比自己瞎猜强十倍。我每次写复杂循环之前,习惯先在纸上画一遍流程,跑通了再写代码,省去大量调试时间。
好,这一章的核心就这些。分支和循环是编程的骨架,以后每段稍微复杂的代码都离不开它们。多练几次,你会发现这些模式其实还挺固定的。