Python中且或逻辑运算符and和or的基础用法

小林子
小林子
发布时间:2026-11-05| 9人浏览过
原创

系统讲解Python中逻辑运算符and和or的基础用法,包括真假值判定、短路求值运行流水线、非布尔对象返回值机制、运算优先级以及在生产开发中的安全防御与避坑实践。

Python中且或逻辑运算符and和or的基础用法
概览:Python 逻辑运算符 and 与 or 的执行基石(短路求值与操作数传递)
在 Python 中,逻辑运算符 and(逻辑且)与 or(逻辑或)用于组合多个条件并决定程序的执行路径。与部分语言不同的是,Python 中的 and 和 or 并不强制将结果转换为布尔类型(True 或 False),而是遵循“短路求值”规则直接返回最终决定表达式真假的那个操作数本身。本文将从基础逻辑规则、Python 的真假值判定系统、短路求值流水线、非布尔对象返回值机制,以及高频实战模式与经典语法陷阱,帮助读者彻底掌握这两个核心运算符。

一、基础认知:真假值测试与布尔判定

理解 and 和 or 的前提,是明确 Python 是如何判断一个对象是“真”还是“假”的。在 Python 中,所有类型的对象都可以直接用于逻辑判断,解释器会隐式调用其内部的 bool() 函数完成真假评估。

在 Python 的标准定义中,除了显式的布尔常量 False 之外,以下对象在逻辑判断中都会被判定为假(即 Falsy):

  • 常量:None 和 False
  • 所有数值类型的数值零:整数 0、浮点数 0.0、复数 0j 以及 Decimal(0)
  • 所有空的序列或集合类型:空字符串 ""、空元组 ()、空列表 []、空字典 {}、空集合 set()

除上述明确列举的假值外,绝大多数其他对象(包括非零数字、包含至少一个元素的字符串或容器、以及普通的类实例对象)在逻辑运算中均被视为真(即 Truthy)。

Python中且或逻辑运算符and和or的基础用法
图 1:Python 对象真假值分类及 and / or 双目表达式判定矩阵

二、核心规则与短路求值机制(Short-Circuit Evaluation)

日常编写代码时,开发者最常问的问题是:“如果一个表达式包含多个条件,Python 是一定会把所有条件都执行完吗?”答案是否定的。Python 对逻辑运算符严格采用短路求值(惰性求值)策略。

1. 逻辑与(and)的短路规约

and 运算符的语义是“全真才为真”。其计算顺序严格从左到右:

  1. 计算左侧操作数 expr1 的真值。
  2. 若 expr1 为假:由于整式已不可能为真,Python 立即停止计算,触发短路,直接返回 expr1,完全不计算右侧的 expr2。
  3. 若 expr1 为真:整式的最终结果取决于右侧,Python 继续计算 expr2,并直接返回 expr2 的值。

2. 逻辑或(or)的短路规约

or 运算符的语义是“任一为真即为真”。同样按从左到右的顺序求值:

  1. 计算左侧操作数 expr1 的真值。
  2. 若 expr1 为真:只要有一个条件成立,整式就已经确定为真,Python 立即触发短路,直接返回 expr1,完全忽略并跳过右侧的 expr2。
  3. 若 expr1 为假:当前操作数无法决定整体为真,Python 继续计算 expr2,并直接返回 expr2 的值。
Python中且或逻辑运算符and和or的基础用法
图 2:Python 逻辑运算符短路求值的判断步骤与执行流水线

短路求值的存在不仅节约了不必要的运算开销,更重要的作用是构建代码安全屏障。在访问可能为空的对象或可能会抛出异常的复杂计算前,可以通过前置条件进行安全拦截:

# 示例代码:利用 and 的短路特性防止空指针异常与除以零报错 user = None if user is not None and user.is_authenticated: print("用户已认证") else: print("未检测到有效登录用户") divisor = 0 # 若无短路机制,divisor != 0 和 100 / divisor 都会执行,导致 ZeroDivisionError if divisor != 0 and (100 / divisor) > 10: print("计算达标") else: print("跳过计算,防止除以零")
示例运行输出
未检测到有效登录用户
跳过计算,防止除以零

三、关键特性:为什么返回值往往不是 True 或 False?

在 C/C++、Java 等语言中,逻辑运算符无论接收什么类型的参数,最终结果都会强制转成 bool。而在 Python 官方规范中,and 和 or 返回的是“最终决定了该表达式逻辑真假的操作数本身”。

我们可以用两个极其精简的等价三元表达式来概括这一特性:

  • x and y 等价于:x if not bool(x) else y
  • x or y 等价于:x if bool(x) else y
Python中且或逻辑运算符and和or的基础用法
图 3:Python 逻辑运算符非布尔对象原样传递机制解析

下面的代码展示了不同数据类型传入 and 与 or 时的真实返回情况:

# 1. and 运算符实测:遇到首个假值立即返回它,否则返回最后一个操作数 print(0 and "hello") # 输出: 0 (0为假,直接返回0) print("hello" and [1, 2]) # 输出: [1, 2] ("hello"为真,继续求值并返回[1, 2]) print([] and 100) # 输出: [] ([]为空列表假值,直接返回[]) # 2. or 运算符实测:遇到首个真值立即返回它,否则返回最后一个操作数 print("default" or 123) # 输出: "default" (非空串为真,触发短路返回) print("" or "fallback") # 输出: "fallback" (""为假,求值并返回兜底值) print(None or 0 or "valid") # 输出: "valid" (前两者均为假,遇第三者为真时返回)
示例运行输出
0
[1, 2]
[]
default
fallback
valid
要点提示:在 if、while 等控制语句中使用时,Python 会自动对最终返回的对象做布尔求值,因此 if 0 and "hello": 与 if False: 行为完全一致,不会因为返回的是 0 而影响分支判断逻辑。

四、运算符优先级与表达式分组

当一个复杂表达式中同时出现比较符、not、and、or 时,求值优先级决定了它们的结合次序。Python 的逻辑运算符优先级规则如下:

  1. 最高优先级:比较运算符(如 ==, !=, <, >, in, is)
  2. 次高优先级:一元逻辑非 not
  3. 中等优先级:逻辑与 and
  4. 最低优先级:逻辑或 or
# 分析表达式:False and False or True # 由于 and 优先级高于 or,表达式等价于 (False and False) or True res1 = False and False or True print(res1) # 结果为 True # 若希望先计算后面的 or,必须显式添加小括号 res2 = False and (False or True) print(res2) # 结果为 False
示例运行输出
True
False
工程规范:不要过度依赖语言的默认优先级记忆。在任何包含两种及以上逻辑运算符的复合条件判断中,显式使用小括号 () 进行分组,既能杜绝逻辑歧义,也能大幅提高代码的可读性与可维护性。

五、高频实战应用与常见误区排查

1. 经典实战场景

场景一:优雅的默认值回退(Fallback Pattern)
当某个变量可能为空(None 或空字符串)时,利用 or 的特性可以极为简洁地设置后置默认值:

# 从环境或参数中获取配置,为空则回退到默认端口 raw_port = "" port = raw_port or "8080" print(f"最终使用的端口: {port}") # 输出 8080
注意边界:若有效值本身就包含数值 0 或布尔值 False,使用 or 会误触发回退。例如 timeout = input_timeout or 30,若用户传入 0(表示不超时),0 or 30 将错误地返回 30。此时应显式判断 if input_timeout is not None:。

场景二:连环安全属性检查(Chain Guard)
在深层字典或复杂模型数据解析中,使用 and 进行层级防御:

profile = {"settings": {"theme": "dark"}} # 安全提取,防止 KeyError theme = profile and profile.get("settings") and profile["settings"].get("theme") print(f"用户主题: {theme}") # 输出: dark

2. 常见语法误区与纠错

陷阱一:条件合并写成 if x == 1 or 2:
初学者常把“如果 x 等于 1 或等于 2”误写为 if x == 1 or 2:。因为 == 优先级高于 or,该表达式实际上被解析为 (x == 1) or (2)。在 Python 中,非零数字 2 是恒真值,所以 (x == 1) or True 的计算结果永远是真,导致 if 分支永远被执行!

x = 99 # 明显不等于 1 或 2 # 错误示范:恒为 True! if x == 1 or 2: print("错误分支被意外触发!") # 正确方案 A:完整书写两侧比较 if x == 1 or x == 2: print("方案 A 匹配成功") # 正确方案 B:使用成员运算符 in(更优雅推荐) if x in (1, 2): print("方案 B 匹配成功")
示例运行输出
错误分支被意外触发!

陷阱二:混淆逻辑运算符(and / or)与按位运算符(& / |)
& 和 | 是按位运算符(Bitwise Operators),它们对整型的二进制位进行按位与、按位或计算,或者用于集合的交集和并集操作。位运算符优先级远高于比较运算符,并且完全不具备短路求值特性,会对两边的表达式全部强制求值。在编写业务条件分支时,必须统一使用 and 和 or。

Python中且或逻辑运算符and和or的基础用法
图 4:Python 逻辑运算符核心知识全景、优先级及工程实战避坑总结

六、总结与速查清单

运算符 运算语义 短路触发条件 返回值规律 典型应用场景
and 逻辑且(与) 左侧操作数为假(Falsy) 返回第一个假值;若全真则返回最后一个真值 多条件复合校验、前置空指针/防越界防护
or 逻辑或 左侧操作数为真(Truthy) 返回第一个真值;若全假则返回最后一个假值 默认值优雅回退兜底、多选一条件命中分支
not 逻辑非(一元) 无短路概念 严格返回布尔常量 True 或 False 状态取反、反向状态判断

掌握 and 和 or 的精髓在于牢记两点:按需计算的短路流水线与原样透传的操作数返回机制。在日常编码中,配合括号进行清晰的结构表达,不仅能写出高效优雅的代码,还能天然规避绝大多数由空值与异常引发的潜在缺陷。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。