4. 分支和循环:if判断语句、运算符、if-else语句、while循环、for循环、break、continue
控制流程,说白了就是让程序学会「做选择」和「反复做」。没有控制流程的程序,就像一条笔直的单行道——从头走到尾,一步不多,一步不少。但真实的硬件控制场景,哪有这么简单?
我记得刚入行时写第一个温控程序,传感器读到温度超过阈值就报警,低于阈值就加热。当时我心想:这不就是「如果…就…」吗?没错,Python 里最核心的控制结构,就是 分支 和 循环。
4.1 运算符:判断的基石
做判断之前,你得先会「比大小」。Python 的运算符分几类,我列个表给你看:
| 类型 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 比较运算符 | == != > < >= <= |
比较两个值,返回 True/False | temp > 30 |
| 逻辑运算符 | and or not |
组合多个条件 | temp > 30 and humidity < 60 |
| 成员运算符 | in not in |
检查是否在序列中 | pin in [1, 2, 3] |
| 身份运算符 | is is not |
检查是否为同一对象 | led is not None |
30 < temp 而不是 temp > 30。为什么?因为万一你手滑写成 =,Python 会直接报语法错误,而不是偷偷赋值。这个习惯救过我很多次。
4.2 if 判断语句:让程序学会选择
最简单的判断,就是 if。条件为真,就执行缩进里的代码。
temperature = 35
if temperature > 30:
print("温度过高,启动散热风扇")
fan.on()
你想想看,如果温度没超过 30 度,这段代码什么都不做。风扇安安静静地待着。这就是最基础的分支。
4.3 if-else 语句:两条路选一条
现实世界往往是非此即彼。温度高了开风扇,温度低了关风扇。这时候 if-else 就派上用场了。
if temperature > 30:
print("开启散热")
fan.on()
else:
print("温度正常,关闭风扇")
fan.off()
我曾经在做一个恒温箱项目时,只写了 if 没写 else。结果温度降下来后风扇一直转,把样品吹得乱七八糟。嗯,从那以后我写条件判断,一定会问自己一句:「不满足条件时,该做什么?」
4.4 if-elif-else 多分支:多条路选一条
条件多了怎么办?比如温度分三档:低温、正常、高温。用 elif 串联起来:
if temperature < 10:
print("低温,启动加热")
heater.on()
elif temperature < 30:
print("温度正常,什么都不做")
pass
else:
print("高温,启动散热")
fan.on()
temp < 100 写在 temp < 30 前面,结果永远进不了后面的分支。
4.5 while 循环:反复做,直到条件不满足
循环,就是让程序反复执行同一段代码。最简单的循环是 while:条件为真就一直做。
count = 0
while count < 5:
print(f"第 {count+1} 次闪烁")
led.on()
time.sleep(0.5)
led.off()
time.sleep(0.5)
count += 1 # 别忘了更新计数器!
这里有个坑:一定要在循环体内改变条件变量。如果你忘了写 count += 1,这个循环就会永远跑下去——死循环。我在调试一个电机控制程序时,就因为这个 bug,电机嗡嗡转了十分钟,直到我拔掉电源。
- 错误用法:忘记更新条件,程序卡死
- 正确用法:主动写
while True,配合break退出——比如主循环、按键检测循环
4.6 for 循环:遍历一切
for 循环比 while 更常用。它用来遍历一个序列(列表、元组、字符串、range 等)。
# 遍历列表
pins = [2, 3, 4, 5, 6]
for pin in pins:
print(f"初始化引脚 {pin}")
GPIO.setup(pin, GPIO.OUT)
# 用 range 生成数字序列
for i in range(5): # 0, 1, 2, 3, 4
print(f"第 {i+1} 次循环")
# 遍历字典
sensor_config = {"temp": "A0", "humidity": "A1", "light": "A2"}
for key, value in sensor_config.items():
print(f"{key} 传感器接在 {value} 引脚")
我个人习惯用 for 而不是 while,除非我真的需要「直到某个条件才停止」。因为 for 自动帮你管理迭代,不容易写出死循环。
4.7 break 和 continue:控制循环的节奏
有时候,你不想让循环跑完所有次数。比如传感器读到异常值,立刻停止;或者跳过某些不需要处理的数据。
- break:立即跳出整个循环
- continue:跳过本次循环,进入下一次
# break 示例:读到异常值就停止
sensor_readings = [22, 23, 21, 999, 24, 25]
for reading in sensor_readings:
if reading > 100:
print(f"异常值 {reading},停止读取")
break
print(f"正常温度:{reading}")
# continue 示例:跳过无效数据
data = [12, None, 15, None, 18, 20]
for value in data:
if value is None:
print("跳过无效数据")
continue
print(f"处理数据:{value}")
break,以为能跳出两层循环,结果只跳出了内层。Python 的 break 只跳出当前这一层循环。想跳出多层?要么用标志变量,要么把内层循环封装成函数,用 return 代替。
4.8 知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作一张「控制流程地图」:
4.9 实战:温控风扇的完整逻辑
把上面所有知识点串起来,写一个完整的温控风扇控制逻辑。这个代码我在智能家居项目里用过类似的:
import time
# 模拟传感器读数
def read_temperature():
# 实际项目中这里会调用 ADC 读取
return 28 # 假设当前温度
# 模拟风扇控制
class Fan:
def __init__(self):
self.status = "OFF"
def on(self):
self.status = "ON"
print("风扇开启")
def off(self):
self.status = "OFF"
print("风扇关闭")
fan = Fan()
running = True
while running: # 主循环
temp = read_temperature()
if temp > 35:
print("⚠️ 超高温!强制开启风扇")
fan.on()
elif temp > 30:
print("🌡️ 高温,开启风扇")
fan.on()
elif temp < 20:
print("❄️ 低温,关闭风扇")
fan.off()
else:
print("✅ 温度正常,保持当前状态")
# 保持风扇状态不变
# 每 2 秒检测一次
time.sleep(2)
# 模拟用户按下停止按钮
# 实际项目中这里会检测 GPIO 中断
# if stop_button.is_pressed:
# running = False
# break
while running是主循环,用标志变量控制退出if-elif-else处理多级温度阈值- 注释里预留了
break的退出路径 - 实际项目中,
time.sleep()会被定时器或中断替代
分支和循环,说白了就是程序的「大脑」和「心脏」。大脑做决策,心脏持续跳动。你写硬件控制程序,本质上就是在不断重复「读传感器 → 做判断 → 控制执行器」这个循环。把这两个结构用好,你的程序就有了灵魂。