📌 引言:程序也需要“大脑”
到目前为止,我们写的代码都是“直肠子”——从上到下一条线执行,像机器人一样机械。但现实世界哪有这么简单?
- 如果明天天气好,我就去爬山;否则在家打游戏。
- 每天都要吃饭,但吃什么得看心情。
- 直到学会为止,反复练习。
流程控制就是给程序装上“大脑”,让它能:
- 判断:根据不同情况走不同分支(if-elif-else)
- 重复:反复执行某段任务(循环)
- 跳过或终止:遇到特殊情况及时处理(break/continue)
- 预留空位:有些地方以后再说(pass)
本章我们将彻底掌握 Python 的流程控制,让你的程序真正活起来。
一、条件判断:if-elif-else
1️⃣ 基本语法
if 条件1:
# 条件1为真时执行的代码块
elif 条件2:
# 条件2为真时执行的代码块
else:
# 以上条件都不满足时执行
关键点:
- 每个条件后面都有冒号 :
- 代码块必须缩进(通常4个空格)
- elif 和 else 可选
- 一旦某个条件为真,执行完对应代码块后就会跳过剩余判断
示例:年龄分级
age = 18
if age < 12:
print("小朋友")
elif age < 18:
print("青少年")
elif age < 60:
print("成年人")
else:
print("老年人")
2️⃣ 条件表达式(三元运算符)
Python 支持一行写完的简单 if-else:
value = 10
result = "大于5" if value > 5 else "不大于5"
print(result) # 大于5
语法:表达式1 if 条件 else 表达式2
适合简单的二选一赋值,别写复杂了(否则别人看不懂)。
3️⃣ 嵌套 if
if 里面可以再套 if,但要注意缩进:
x = 10
if x > 0:
print("正数")
if x % 2 == 0:
print("而且是偶数")
else:
print("非正数")
⚠️ 不要嵌套太深(超过3层代码就臭了)。后续可以用逻辑运算符 and、or 简化。
4️⃣ 布尔值隐式转换
Python 在判断条件时,会尝试把条件转换为布尔值。以下值被视为 False:
- None
- False
- 0(整数0,浮点0.0)
- 空序列/集合:'', [], (), {}, set(), range(0)
- 自定义类如果定义了 __bool__() 或 __len__() 返回 False
其他值都是 True。
name = input("输入名字:")
if name: # 如果字符串非空
print(f"你好,{name}")
else:
print("你好,匿名用户")
🧠 冷知识:if 可以没有条件吗?
不能。但可以用 if True: 创造永真块,或者 if False: 临时注释代码块(不推荐,不如用注释)。
二、循环:重复的力量
1️⃣ while 循环:直到条件不满足
count = 1
while count <= 5:
print(f"第{count}次循环")
count += 1
死循环(无限循环)
while True:
print("停不下来啦!")
# 记得用 break 跳出
示例:猜数字游戏
import random
secret = random.randint(1, 100)
guess = None
while guess != secret:
guess = int(input("猜一个1-100的数字:"))
if guess < secret:
print("小了")
elif guess > secret:
print("大了")
print("恭喜你猜对了!")
2️⃣ for 循环:遍历一切可迭代对象
Python 的 for 循环是迭代器循环,可以遍历任何可迭代对象(列表、字符串、字典、文件、range 等)。
遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(fruit)
遍历字符串
for char in "Python":
print(char)
遍历字典
person = {"name": "Alice", "age": 25, "city": "北京"}
for key in person: # 遍历键
print(key, person[key])
for value in person.values(): # 遍历值
print(value)
for key, value in person.items(): # 同时遍历键和值
print(f"{key}: {value}")
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(1, 10, 2): # 1,3,5,7,9
print(i)
enumerate():同时获取索引和值
fruits = ["苹果", "香蕉", "橙子"]
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
3️⃣ break 和 continue:循环的“刹车”和“跳过”
break:立即跳出整个循环
for i in range(10):
if i == 5:
break
print(i) # 输出 0 1 2 3 4
continue:跳过本次迭代,进入下一次
for i in range(10):
if i % 2 == 0: # 偶数跳过
continue
print(i) # 输出奇数:1 3 5 7 9
示例:用 break 优化素数判断
n = 17
is_prime = True
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
is_prime = False
break # 一旦发现能整除,立即跳出,不用继续试
print(f"{n}是素数?{is_prime}")
4️⃣ 循环的 else 子句:循环“自然结束”时执行
这是 Python 独有的特性(很多语言没有)。当循环没有被 break 中断,正常结束后会执行 else 块。
while-else 示例
n = 5
while n > 0:
print(n)
n -= 1
else:
print("倒计时结束!")
for-else 示例(常用)
numbers = [2, 4, 6, 8]
for num in numbers:
if num % 2 != 0:
print("发现奇数")
break
else:
print("全是偶数") # 因为没 break,会执行这里
经典用法:在循环中查找元素,如果找到就 break,没找到则执行 else 处理未找到的情况。
🧠 冷知识:for 循环比 while 快?
在遍历序列时,for 通常比手动的 while 索引更快,因为 for 底层直接使用迭代器,减少了属性查找。但性能差异一般不大,选可读性高的即可。
三、占位符 pass:啥也不干,但合法
Python 中不能有空的代码块(比如空的 if 块会报错)。如果你还没想好怎么写,可以用 pass 占个位置。
if condition:
pass # 等会再实现
else:
print("干活")
def my_function():
pass # 先定义函数,后面再写实现
class MyClass:
pass # 空类
pass 就是一句“这里啥也没有”,程序执行它就直接跳过。
四、模式匹配 match-case(Python 3.10+)
从 Python 3.10 开始,引入了类似其他语言 switch 的 match 语句,但更强大,支持模式匹配。
1️⃣ 基本语法
match 值:
case 模式1:
# 匹配模式1时执行
case 模式2:
# 匹配模式2时执行
case _:
# 默认分支(类似 else)
注意:
- 不需要 break,匹配到第一个分支后自动退出
- 下划线 _ 是通配符,匹配任何值
示例:简单的 HTTP 状态码
status = 404
match status:
case 200:
print("OK")
case 404:
print("Not Found")
case 500:
print("Internal Server Error")
case _:
print("未知状态")
2️⃣ 匹配字面量和变量
point = (0, 0)
match point:
case (0, 0):
print("原点")
case (0, y):
print(f"在 Y 轴上,y={y}")
case (x, 0):
print(f"在 X 轴上,x={x}")
case (x, y):
print(f"坐标为 ({x}, {y})")
case _:
print("不是二维点")
这里的 x、y 是变量,会从匹配的值中提取。
3️⃣ 守卫条件(if)
可以在模式后加 if 条件进一步筛选:
match value:
case int(x) if x > 0:
print(f"正整数 {x}")
case int(x):
print(f"非正整数 {x}")
case str(s):
print(f"字符串 {s}")
4️⃣ 匹配多个模式(用 |)
match day:
case "周六" | "周日":
print("周末")
case "周一" | "周二" | "周三" | "周四" | "周五":
print("工作日")
🧠 冷知识:match-case 不只是“开关”
它可以解包元组、列表、字典,甚至可以匹配对象属性,非常强大。但初学者先掌握基本用法即可,深入的模式匹配(如类模式、映射模式)可以以后再看。
✅ 本章总结
| if-elif-else | 条件分支 | 缩进,冒号,布尔隐式转换 |
| 条件表达式 | 简洁的二选一 | a if cond else b |
| while | 条件循环 | 防止死循环,可用 break |
| for | 迭代循环 | 遍历一切可迭代对象 |
| break | 跳出循环 | 立即终止 |
| continue | 跳过本次迭代 | 进入下一次循环 |
| else (循环) | 循环正常结束执行 | 未被 break 时触发 |
| pass | 占位符 | 避免空代码块报错 |
| match-case | 模式匹配(3.10+) | 强大,类似 switch 但更灵活 |
流程控制是程序的“灵魂”。现在你的程序已经能思考、能重复、能处理异常情况了。
🚀 下集预告
下一章我们将进入编程的核心——函数。学会把重复代码打包,实现“一次编写,到处调用”。你还会学到参数传递、作用域、递归等概念。准备好让代码变得模块化了吗?
记得动手写几个小程序巩固本章知识,比如:
- 猜数字游戏(while、if)
- 打印九九乘法表(for 嵌套)
- 用 for-else 判断一个列表是否全是正数
- 用 match-case 写一个简单的计算器
代码写多了,流程控制就会像呼吸一样自然!💨





