Python常用运算符速查手册:含义、示例与注意事项

季宁
季宁
发布时间:2026-10-23| 4人浏览过
原创

在编写 Python 逻辑时,运算符是构建条件控制、数据处理和算法逻辑的核心基石。许多初学者在遇到 -7 // 2 算出的意外结果、将 == 与 is 混淆导致条件误判,或是被 and/or 的短路特性打乱变量赋值时,往往缺乏一张条理清晰、即查即用的全景对照图。本文系统梳理 Python 的常用运算符体系,通过直观的分类示例、机制解析与关键避坑指引,帮助你在编码时做出准确判断。

Python常用运算符速查手册:含义、示例与注意事项
图 1:Python 常用运算符核心分类及设计场景概览

一、算术运算符:数值计算与取整陷阱

算术运算符用于执行基础数学计算。在大多数场景中它们的表现与常规数学认知一致,但有几个与除法相关的细节极易引发隐藏错误:

运算符 名称 示例表达式 计算结果 关键行为解释
+ 加法 / 拼接 10 + 5 / 'a' + 'b' 15 / 'ab' 数值相加;若操作数是序列类型(如字符串、列表)则执行拼接。
- 减法 / 取负 10 - 4 / -x 6 二元减法或一元取相反数。
* 乘法 / 重复 4 * 3 / 'py' * 2 12 / 'pypy' 数值相乘;序列与整数相乘表示重复元素。
/ 真除法(浮点除) 10 / 2 5.0 无论能否整除,返回值必然是浮点型 float。
// 地板除(向下取整) 7 // 2 / -7 // 2 3 / -4 向数轴负无穷方向取整,在负数除法中非简单截断小数。
% 模运算(求余) 7 % 3 / -7 % 3 1 / 2 满足关系:a == (a // b) * b + (a % b)。
** 幂运算(次方) 2 ** 3 8 等价于 pow(2, 3);优先级高于一元减号。

通过下方代码可直观验证上述关键细节:

# 示例代码:除法、负数地板除与模运算
# 1. 普通真除法
res_div = 7 / 2
print("7 / 2 =", res_div)  # 示例输出: 7 / 2 = 3.5

# 2. 地板除与负数向负无穷取整
pos_floor = 7 // 2
neg_floor = -7 // 2
print("7 // 2 =", pos_floor)   # 示例输出: 7 // 2 = 3
print("-7 // 2 =", neg_floor)  # 示例输出: -7 // 2 = -4 (注意不是 -3)

# 3. 模运算规律
print("7 % 3 =", 7 % 3)    # 示例输出: 7 % 3 = 1
print("-7 % 3 =", -7 % 3)  # 示例输出: -7 % 3 = 2
注意事项:很多开发者误以为 -7 // 2 等于 -3(如同 C/Java 中的截断除法)。Python 严格遵循“向下取整到最接近负无穷的整数”(Floor Division)原则,因此 -3.5 向下取整必然为 -4。

二、比较与身份运算符:值相等与对象同一性的边界

在条件判断中,开发者经常需要判定两个对象是否一致。Python 明确拆分了两种不同的比较维度:== 比较内容数值是否相同,而 is 比较是否为内存中的同一个对象。

Python常用运算符速查手册:含义、示例与注意事项
图 2:== 与 is 在 Python 内存模型中的判定机制差异

在代码编写中,应遵循以下核心原则:

  • 判断普通数值、字符串、列表等是否具有相同的“值”,一律使用 == 或 !=。
  • 判断变量是否为 None,或者判断是否为全局唯一的单例对象时,必须使用 is None 或 is not None。
  • Python 会在内部对 [-5, 256] 的小整数以及简短字符串建立对象池缓存,使得 a = 250; b = 250; a is b 偶然为 True,但决不能在生产代码中依赖这种实现细节。
# 示例代码:身份与内容比较
list_a = [10, 20, 30]
list_b = [10, 20, 30]

print("list_a == list_b:", list_a == list_b)  # 示例输出: True (内容相等)
print("list_a is list_b:", list_a is list_b)  # 示例输出: False (内存地址不同: id 不同)

# 正确与错误的 None 判断方式
target = None
if target is None:
    print("target 正确识别为 None")  # 示例输出: target 正确识别为 None

三、逻辑运算符与短路求值机制

Python 提供了三个核心逻辑运算符:and、or 与 not。不同于其他语言可能返回布尔值 true/false,Python 的 and 与 or 运算直接返回触发终止判定的那个操作数本身,并具备短路求值(Short-circuit Evaluation)特性。

Python常用运算符速查手册:含义、示例与注意事项
图 3:Python 逻辑运算符短路求值执行逻辑流

理解短路机制能够带来两项关键实用技巧:

  1. 安全防护链:利用 and 避免抛出异常,例如 user is not None and user.is_active。如果 user 是 None,后半部分代码根本不会被执行,从而有效防止产生 AttributeError。
  2. 默认值回退:利用 or 赋默认值,例如 timeout = custom_timeout or 30。注意当 custom_timeout 合法取值为数字 0 时,也会被视作假值而导致回退为 30,需视实际业务严谨处理。

四、成员与赋值运算符:容器检索与原地修改

1. 成员运算符(in / not in)

成员运算符用于测试指定序列或容器类型中是否存在目标元素,语法简洁且可读性高:

fruits = ["apple", "banana", "cherry"]
print("apple" in fruits)      # 示例输出: True
print("orange" not in fruits)  # 示例输出: True

# 在字典中使用 in
user_info = {"name": "Alice", "role": "admin"}
print("role" in user_info)     # 示例输出: True (默认检索字典的 Key)
print("admin" in user_info)    # 示例输出: False (若检索 Value,需写 user_info.values())
性能提示:在 list 或 tuple 中使用 in 运算符的时间复杂度是 O(n),而在 set 或 dict 中使用 in 的时间复杂度为 O(1)。在大规模数据检索场景中,建议优先将容器转换为集合或哈希表。

2. 复合赋值运算符(Augmented Assignment)

复合赋值运算符(如 +=, -=, *=, /= 等)将运算与赋值合并进行。需要特别关注的是其在可变对象(如列表)与不可变对象(如整数、元组)上的本质差异:

# 不可变对象 (数字/字符串/元组):重新绑定新对象
x = 100
orig_id = id(x)
x += 1
print("不可变对象 id 是否变更:", id(x) != orig_id)  # 示例输出: True (生成了新整数对象)

# 可变对象 (列表):就地修改 (In-place mutation)
lst_a = [1, 2]
orig_lst_id = id(lst_a)
lst_a += [3]  # 等价于 lst_a.extend([3])
print("列表 += 后 id 是否一致:", id(lst_a) == orig_lst_id)  # 示例输出: True (原地修改)

# 对比:使用 lst = lst + [4] 则会开辟新列表!

五、运算符优先级与结合性规范

当一个复杂表达式中包含多种运算符时,Python 依据固定的优先级法则决定运算先后次序。下表从高到低列出常用运算符的优先级与结合性:

Python常用运算符速查手册:含义、示例与注意事项
图 4:Python 运算符优先级阶梯与求值过程分解

六、高频易错避坑总结

1. 浮点数精度比较陷阱

在底层计算机二进制表示中,多数十进制小数无法被精确存储。因此切忌直接对浮点数使用 == 判断相等:

# 常见错误:直接使用 == 比较浮点数
sum_val = 0.1 + 0.2
print("0.1 + 0.2 == 0.3:", sum_val == 0.3)  # 示例输出: False (实际值为 0.30000000000000004)

# 正确做法:使用 math.isclose 设定容差范围
import math
print("math.isclose 判断:", math.isclose(0.1 + 0.2, 0.3))  # 示例输出: True

2. 链式比较的连读特性

Python 支持数学风格的链式比较。例如 1 < x < 5 会在内部隐式扩展为 1 < x and x < 5,其中 x 仅被求值一次。但需防范反直觉的书写:

# 示例:链式比较成立
x = 3
print("1 < x < 5:", 1 < x < 5)  # 示例输出: True

# 潜在陷阱:链式比较并非布尔值的传递
print("True == 1 == 1.0:", True == 1 == 1.0)  # 示例输出: True (True == 1 为真,且 1 == 1.0 为真)
print("False == 0 < 1:", False == 0 < 1)      # 示例输出: True (False == 0 为真,且 0 < 1 为真)

3. 乘法重复嵌套列表的引用污染

使用乘法运算符 * 重复含有可变对象的列表时,复制的是对象的引用,而不是独立的新对象:

# 危险操作:乘法创建二维矩阵
matrix = [[0] * 3] * 3
matrix[0][0] = 99
print("修改 matrix[0][0] 后的矩阵:", matrix)
# 示例输出: [[99, 0, 0], [99, 0, 0], [99, 0, 0]]
# 原因:3 个内层子列表指向同一块内存!

# 正确做法:使用列表推导式独立初始化各行
safe_matrix = [[0] * 3 for _ in range(3)]
safe_matrix[0][0] = 99
print("安全推导后的矩阵:", safe_matrix)
# 示例输出: [[99, 0, 0], [0, 0, 0], [0, 0, 0]]

七、总结速查清单

  1. 除法选型:精确小数计算用真除法 /;网格分块、分页对齐用整除 //,并时刻记住负数向负无穷取整。
  2. 比较规范:比对内容与数值用 ==,检查单例、空值与全局对象一律用 is None。
  3. 逻辑控制:牢记 and 遇假即止、or 遇真即止的短路规则,返回的是决定结果的对象本体。
  4. 防御括号:混合运算无论何时,优先加上 (),这是编写清晰可维护 Python 代码的第一准则。
相关标签:

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

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 算法库。