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()
注意顺序:Python 从上到下依次判断,遇到第一个为真的条件就执行,然后跳过整个 if 块。所以范围小的条件要写在前面,范围大的写在后面。我曾经见过有人把 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 知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一张「控制流程地图」:

分支与循环知识体系 分支与循环知识体系 分支结构 循环结构 if 单分支:条件为真则执行 if-else 双分支:二选一 if-elif-else 多分支:多选一 运算符:比较 / 逻辑 / 成员 条件表达式:x if cond else y while 循环:条件为真持续执行 for 循环:遍历序列 / range break:立即跳出整个循环 continue:跳过本次循环 else 子句:循环正常结束执行 可嵌套 核心原则:分支做选择,循环做重复,两者可嵌套使用

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() 会被定时器或中断替代

分支和循环,说白了就是程序的「大脑」和「心脏」。大脑做决策,心脏持续跳动。你写硬件控制程序,本质上就是在不断重复「读传感器 → 做判断 → 控制执行器」这个循环。把这两个结构用好,你的程序就有了灵魂。