013、Python条件判断:if、elif、else语句

张开发
2026/4/18 8:30:16 15 分钟阅读

分享文章

013、Python条件判断:if、elif、else语句
013、Python条件判断if、elif、else语句昨天帮实习生调试代码遇到这么个问题一个硬件状态监测脚本温度超过50度要报警超过80度要紧急停机。结果测试时温度到了85度只报了警却没停机。查了半天发现代码是这样写的iftemperature50:print(警告温度过高)iftemperature80:print(紧急立即停机)问题出在哪两个独立的if语句都会执行85度时两个条件都满足两条消息都打印了。但实际业务逻辑应该是“超过80度就只需要停机不用再报警”。这就是没理解条件判断的层级关系。基础if语句程序的分岔路口编程和现实决策一样总要做选择。if语句就是Python里的决策者。# 最简单的形式if条件:执行语句# 例子检查网络连接状态connection_activeTrueifconnection_active:print(设备在线)# 条件为True时才执行这行print(检查完成)# 这行总是会执行注意那个冒号这是Python的语法标志告诉解释器“条件判断开始了”。缩进是Python的灵魂if下面的代码必须缩进通常4个空格表示“这些代码属于这个if”。二选一if-else结构很多时候我们需要“要么这样要么那样”的逻辑。# 硬件自检示例sensor_readyFalseifsensor_ready:print(传感器正常开始采集)else:print(传感器异常启用备用方案)# 条件为False时走这条路调试时经常用这种结构来验证逻辑# 快速调试技巧debug_modeTruedataread_from_device()ifdebug_mode:print(f原始数据:{data})# 调试时看原始数据else:process_data(data)# 正式运行直接处理多条件判断if-elif-else链回到开头的温度监控问题正确的写法应该是iftemperature80:print(紧急立即停机)eliftemperature50:print(警告温度过高)else:print(温度正常)elif是“else if”的缩写关键点在于整个if-elif-else链只会执行第一个满足条件的分支。温度85度时第一个条件就满足了直接执行停机操作后面的elif看都不看。这种层级判断在嵌入式开发里太常见了# 电池电量管理battery_level45ifbattery_level10:print(电量极低进入省电模式)enter_power_save_mode()elifbattery_level20:print(电量不足请充电)show_low_battery_warning()elifbattery_level50:print(电量中等)# 正常操作什么都不用做else:print(电量充足)注意条件的顺序如果把条件反过来写ifbattery_level50:print(电量中等)elifbattery_level20:print(电量不足)# 永远执行不到这里因为50包含了20的情况第一个条件总是先满足。嵌套判断复杂决策逻辑有些场景需要多层判断比如先判断设备类型再判断设备状态device_typesensordevice_statuserrorifdevice_typesensor:ifdevice_statuserror:print(传感器故障尝试重置)reset_sensor()elifdevice_statuswarning:print(传感器预警记录日志)log_warning()else:print(传感器正常)elifdevice_typeactuator:# 执行器相关的判断...pass嵌套不要太深超过3层就该考虑重构了。深嵌套的代码像迷宫调试时容易晕。条件表达式简洁的赋值判断Python有个很实用的语法糖一行完成判断赋值# 传统写法iftemperature100:status危险else:status正常# 条件表达式写法三元运算符status危险iftemperature100else正常这种写法在初始化配置时特别有用# 根据环境设置采样率is_productionFalsesample_rate1000ifis_productionelse100# 生产环境用高速采样测试用低速实战中的坑与技巧坑1赋值和比较# 新手经典错误ifsensor_statusactive:# 这是赋值不是比较print(设备激活)# 正确写法ifsensor_statusactive:# 两个等号print(设备激活)坑2浮点数比较# 浮点数精度问题voltage3.3/10# 结果是0.33000000000000004ifvoltage0.33:print(电压正常)# 可能永远不会执行# 正确做法允许微小误差ifabs(voltage-0.33)0.0001:print(电压正常)技巧1使用in简化多值比较# 啰嗦写法ifstatuserrororstatuswarningorstatustimeout:handle_problem()# 优雅写法ifstatusin[error,warning,timeout]:handle_problem()技巧2利用布尔值直接判断# 不必写 Truedata_validcheck_data_integrity()ifdata_valid:# 而不是 if data_valid Trueprocess_data()# 判断为False时ifnotdata_valid:log_error()个人经验建议条件顺序就是业务优先级把最紧急、最特殊的情况放前面。像医疗设备监控应该先判断“是否心脏停搏”再判断“是否血压异常”。else不是必须的有些场景下默认情况就是“什么都不做”这时可以省略else。但如果你明确知道所有可能性加上else能避免漏处理。硬件编程多留日志在关键判断分支里加一句日志输出现场调试时能救命。特别是那些“理论上不会发生”的分支。复杂条件先算后判如果判断条件很复杂先算出结果再判断代码更清晰# 不易读if(temperature100andnotis_test_mode)or(voltage3.0andbattery_old):shutdown()# 先算后判overheattemperature100andnotis_test_mode low_voltagevoltage3.0andbattery_oldifoverheatorlow_voltage:shutdown()print(f关机原因: overheat{overheat}, low_voltage{low_voltage})# 调试信息测试边界值写完后专门测试边界情况。温度判断阈值是50度那就测49.9、50.0、50.1三种情况。很多bug都藏在边界上。条件判断是程序智能的起点。写的时候多想想如果我是设备在这种情况下应该怎么反应逻辑是否覆盖了所有可能执行顺序是否符合业务实际把这些想清楚代码自然就健壮了。

更多文章