Python or 运算符 —— 完整深入教程


Python or 运算符 —— 完整深入教程

============================================================

目录

  1. 概念与基本语义
  2. Python 真值(truthy / falsy)的完整规则
  3. or 的短路求值(short-circuit evaluation)
  4. or 的返回值规则(核心)
  5. if 的区别
  6. 常见的工程使用模式(核心部分)
  7. and 的对比
  8. 多层 or 链式逻辑
  9. 在自动控制 / 数据清洗中的最佳实践(结合你的项目)
  10. 源码视角:CPython 如何执行 or
  11. 常见坑与防错策略
  12. 总结

============================================================

1. 概念:Python 中 or 的语义

Python 中的 or 是“逻辑或”,作用是:

返回第一个真值(truthy);如果没有真值,则返回最后一个值。

注意:不是返回 True/False,而是返回原始对象本身。

这是 Python 和 C/Java 最大的区别。

============================================================

2. Python “真值 / 假值”规则

假值(Falsy)包括:

  • False
  • None
  • 0 / 0.0
  • ""(空字符串)
  • [](空列表)
  • {}(空字典)
  • ()(空元组)
  • set()
  • range(0)
  • float('nan') 在 bool 上是 True(特殊,后面解释)
  • 自定义类如果 __bool__ 返回 False

真值(Truthy)包括:

除假值外的所有对象,包括:

  • 任意非空字符串
  • 任意非空容器
  • 任意非零数
  • 对象、实例
  • 函数、类
  • 数据库连接对象
  • Pandas DataFrame(只要不为空)

============================================================

3. or 的执行过程 —— 短路求值

表达式:

A or B

执行流程:

  1. 评估 A 的布尔值
  2. 如果 bool(A) 为 True → 返回 A(停止,不评估 B)
  3. 如果 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. orif 的区别(非常关键)

你在代码里肯定见过:

(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. orand 的组合

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

执行顺序:

  1. 检查 A
  2. 如果 A 假 → 检查 B
  3. 如果 B 假 → 检查 C
  4. 如果 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. 总结(最简版)

核心三句话:

  1. A or B 返回第一个真值,没有真值返回 B。
  2. or 不是返回 bool,而是返回原对象本身。
  3. or 最大的价值是“兜底/默认值/短路”逻辑。

文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录