Python or 运算符 —— 完整深入教程
============================================================
目录
- 概念与基本语义
- Python 真值(truthy / falsy)的完整规则
or的短路求值(short-circuit evaluation)or的返回值规则(核心)- 和
if的区别 - 常见的工程使用模式(核心部分)
- 和
and的对比 - 多层
or链式逻辑 - 在自动控制 / 数据清洗中的最佳实践(结合你的项目)
- 源码视角:CPython 如何执行
or - 常见坑与防错策略
- 总结
============================================================
1. 概念:Python 中 or 的语义
Python 中的 or 是“逻辑或”,作用是:
返回第一个真值(truthy);如果没有真值,则返回最后一个值。
注意:不是返回 True/False,而是返回原始对象本身。
这是 Python 和 C/Java 最大的区别。
============================================================
2. Python “真值 / 假值”规则
假值(Falsy)包括:
FalseNone0/0.0""(空字符串)[](空列表){}(空字典)()(空元组)set()range(0)float('nan')在 bool 上是 True(特殊,后面解释)- 自定义类如果
__bool__返回 False
真值(Truthy)包括:
除假值外的所有对象,包括:
- 任意非空字符串
- 任意非空容器
- 任意非零数
- 对象、实例
- 函数、类
- 数据库连接对象
- Pandas DataFrame(只要不为空)
============================================================
3. or 的执行过程 —— 短路求值
表达式:
A or B
执行流程:
- 评估 A 的布尔值
- 如果
bool(A)为 True → 返回 A(停止,不评估 B) - 如果
bool(A)为 False → 返回 B
Python 的 or 是短路逻辑,
对于大型对象、函数调用、IO 操作,能节省很多开销。
============================================================
4. or 的返回值规则(重点中的重点)
永远记住一句话:
or返回的是第一个真值,不是 True 或 False。
示例:
>>> 0 or 10
10
>>> "" or "hello"
"hello"
>>> [] or [1,2,3]
[1, 2, 3]
>>> "abc" or "xyz"
"abc"
============================================================
5. or 与 if 的区别(非常关键)
你在代码里肯定见过:
(1) 判断真假
if value:
...
这里 if 会把 value 转成 bool。
(2) 返回值表达式
result = value or default
这里会返回原值,而不是 bool。
例子:
value = 0
print(value or 100) # 100
if value:
print("YES") # 不执行
============================================================
6. Python 工程中的典型 or 用法
(1) 默认值机制(最常用)
timeout = user_input or 30
适用于:
- Web API 参数
- 配置文件
- PLC 调参
- 数据库字段有空值时
(2) 字典查询的兜底值
port = config.get("port") or 5432
(3) 避免 None / 空字符串污染计算
value = raw_value or previous_value
(4) 你业务里的典型场景:防止 PLC 写入 None
在你的 1R 代码里,你应该这么用:
safe_value = Data_limited.get(name) or Data_sj[name]
(5) 选择第一个有效变量
v = A or B or C or D
找到第一个非空值就终止。
============================================================
7. or 与 and 的组合
Python 的逻辑运算符不返回布尔值。
定义:
A and B
返回第一个假值;如果没有假值,返回 B。
例子:
>>> 0 and 5
0
>>> 3 and 5
5
>>> "" and "abc"
""
你可以构造复杂逻辑:
result = (A and B) or C
等价于:
如果 A 和 B 都是真值 → 返回 B,否则返回 C
============================================================
8. 多层 or 链式逻辑
v = A or B or C or D
执行顺序:
- 检查 A
- 如果 A 假 → 检查 B
- 如果 B 假 → 检查 C
- 如果 C 假 → 返回 D
典型场景:
- 配置优先级:环境变量 > 配置文件 > 默认参数
- 数据容错处理
- 多级兜底逻辑(你 PLC 控制场景非常常见)
============================================================
9. 你的控制系统场景——最佳实践示例
你在写 1R/2R 自动调控时,经常面对:
- PLC 数据丢失
- 数据库异常值
- 模型输出越界
- OPC 数据断点
你应该这样使用:
(1) 模型输出兜底回退:
safe_value = model_output or last_valid_value
(2) 类型转换容错:
value = float(raw_value or 0)
(3) 复杂优先级逻辑:
target_value = db_value or model_value or plc_value or default_value
(4) PLC 未就绪时跳过:
if not plc or not plc.get_connected():
continue
这里利用的就是 not None 的判断逻辑。
============================================================
10. CPython 源码级解释(进阶)
CPython 的执行流程:
- 解析表达式
- 遇到
or指令:JUMP_IF_TRUE_OR_POP - 如果左值为真 → 保持栈顶值,跳过右值求值
- 如果左值为假 → 弹出左值,评估右值
你可以通过:
import dis
dis.dis("A or B")
看到对应的字节码。
============================================================
11. 常见坑与防错
(1) 错误以为 or 返回 True/False
result = 3 or 5
print(result) # 3
(2) 使用 0 时注意:
0 or 10 # 10
但在控制系统里 0 可能是合法值(如风门全关)。
这时应该写:
safe_value = (value if value is not None else default)
(3) 空字符串 “” 也是假值
如果用户合法输入了 “” 会被覆盖:
db_user = env_user or ""
(4) NaN 的特殊性
float('nan') 布尔值为 True,但是比较不等于自己:
bool(float('nan')) # True
float('nan') == float('nan') # False
============================================================
12. 总结(最简版)
核心三句话:
A or B返回第一个真值,没有真值返回 B。or不是返回 bool,而是返回原对象本身。or最大的价值是“兜底/默认值/短路”逻辑。