Python运算符有哪些:算术、比较、逻辑等7类详解
全面梳理Python中的7类核心运算符:算术、比较、逻辑、赋值、位运算、成员及身份运算符,深入分析短路求值、底层内存比对与优先级规则,配有图解与代码示例。
在 Python 编程中,运算符是用于对变量和数值执行运算操作的特殊符号。Python 语言一共包含 7 大类核心运算符:算术运算符、比较(关系)运算符、逻辑运算符、赋值运算符、位运算符、成员运算符以及身份运算符。本文将依次拆解这 7 类运算符的具体功能、语法细节、运行机制与实际使用场景,帮助你在编写逻辑与处理数据时做到清晰准确。
一、算术运算符:基础数学计算与边界规则
算术运算符用于执行加减乘除等标准数学运算。在 Python 3 中,除法行为有着明确的类型划分:
| 运算符 | 名称 | 示例表达式 | 运算结果说明 |
|---|---|---|---|
+ |
加法 | 7 + 3 |
相加得 10,亦可用于字符串或列表拼接 |
- |
减法 | 7 - 3 |
相减得 4,或表示负数取反 |
* |
乘法 | 7 * 3 |
相乘得 21,亦可用于序列重复 |
/ |
真除法 | 7 / 2 |
得 3.5。无论整除与否,始终返回 float 类型 |
// |
向下整除 | 7 // 2 |
得 3。向负无穷方向取整,例如 -7 // 2 得到 -4 |
% |
取模(求余) | 7 % 3 |
得 1。余数符号满足 a = (a // b) * b + (a % b) |
** |
幂运算 | 2 ** 3 |
得 8。右结合性,2 ** 3 ** 2 等于 2 ** 9 = 512 |
# 算术运算符示例
a = 15
b = 4
print("真除法 a / b :", a / b) # 输出 3.75 (浮点数)
print("整除 a // b :", a // b) # 输出 3 (向负无穷截断)
print("取模 a % b :", a % b) # 输出 3
print("幂运算 a ** 2 :", a ** 2) # 输出 225
# 负数整除与取模的边界测试
print("-15 // 4 :", -15 // 4) # 输出 -4 (而不是 -3)
print("-15 % 4 :", -15 % 4) # 输出 1 (-4 * 4 + 1 = -15)
二、比较运算符:关系判定与链式比较
比较运算符用来测试两个对象之间的关系,返回结果严格为布尔值 True 或 False。包含等于 ==、不等于 !=、大于 >、小于 <、大于等于 >= 与小于等于 <=。
Python 支持极其直观的链式比较(Chained Comparisons)语法。例如 1 < x < 10,在底层等价于 (1 < x) and (x < 10),并且中间的表达式只会求值一次。
x = 5
print(1 < x < 10) # 输出 True,等价于 (1 < x) and (x < 10)
print(10 > x == 5) # 输出 True,等价于 (10 > x) and (x == 5)
# 比较自定义列表内容
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 == list2) # 输出 True,== 会递归比对容器内所有元素的值
三、逻辑运算符:布尔逻辑与短路求值
Python 中的逻辑运算符包含 and(逻辑与)、or(逻辑或)和 not(逻辑非)。在 Python 中,逻辑运算符不仅作用于纯布尔值,还可以操作任意对象。在求值过程中,Python 会采用短路求值(Short-circuit Evaluation)机制:
A and B:如果 A 为假,则整个表达式必然为假,此时直接返回 A,根本不执行也不计算 B;如果 A 为真,则取决于 B,计算并返回 B。A or B:如果 A 为真,则整个表达式必然为真,此时直接短路返回 A,不计算 B;如果 A 为假,则计算并返回 B。not A:对 A 进行真值判断后取反,固定返回True或False。
# 逻辑短路特性示例
def trigger():
print("函数被调用了!")
return True
# 1. and 短路:第一个操作数为假,右侧函数不会执行
result1 = False and trigger()
print("result1:", result1) # 输出 False,控制台不会打印"函数被调用了!"
# 2. or 短路:第一个操作数为真,右侧函数不会执行
result2 = "默认值" or trigger()
print("result2:", result2) # 输出 '默认值'
# 3. 返回原对象而不是固定返回布尔类型
print([] and "abc") # 输出 []
print("python" and "rocks") # 输出 'rocks'
四、赋值运算符:变量绑定与复合赋值机制
赋值运算符负责将右侧表达式的结果绑定至左侧的变量名。除了基本赋值 = 以外,Python 还提供了将算术或位运算与赋值结合的复合赋值运算符:
- 算术复合赋值:
+=、-=、*=、/=、//=、%=、**=。 - 位运算复合赋值:
&=、|=、^=、<<=、>>=。
注意复合赋值在不同数据类型上的机制差异:对于不可变对象(如整数、浮点数、元组、字符串),x += 1 会创建新对象并重新绑定变量;而对于可变对象(如列表),list_a += [4] 会调用 __iadd__ 方法在原有内存地址上原处追加(In-place mutation),其效果相当于 list_a.extend([4]),不会生成新的列表对象。
五、位运算符:二进制位级操作与掩码原理
位运算符直接作用于整数的二进制补码形态,常用于系统级权限管理、底层协议打包和状态掩码操作。Python 包含 6 种位运算符:
&(按位与):两位都为 1 时结果为 1,常用于提取特定标志位。|(按位或):只要有一位为 1 结果就为 1,常用于设置标志位。^(按位异或):两位不同为 1,相同为 0,常用于反转位或简单加密。~(按位取反):每个二进制位取反,在补码系统中~x等价于-(x + 1)。<<(左移):各二进制位向左移动指定位数,低位补 0。每左移一位相当于乘以 2。>>(右移):各二进制位向右移动指定位数。每右移一位相当于向下整除 2。
六、成员运算符:容器存在性检验与查找效率
成员运算符用于测试指定序列或集合中是否存在某个元素,关键字为 in 与 not in。其语法简单直观,但底层性能取决于具体的数据结构:
- 在字符串、列表(List)、元组(Tuple)中:通过线性扫描比对元素,时间复杂度为 O(n)。
- 在集合(Set)、字典(Dictionary)中:基于哈希表(Hash Table)直接定位,时间复杂度平均仅为 O(1)。
- 在字典中使用
item in dict_obj时,默认检索的是字典的键(Keys),若要检索值需明确使用item in dict_obj.values()。
# 成员运算符用法
fruits = ["apple", "banana", "orange"]
print("apple" in fruits) # 输出 True
print("grape" not in fruits) # 输出 True
user_info = {"id": 101, "name": "Alice", "role": "admin"}
print("name" in user_info) # 输出 True (检索键)
print("admin" in user_info) # 输出 False (默认不检索值)
print("admin" in user_info.values()) # 输出 True (显式检索值)
七、身份运算符:内存地址比对与 None 判断规范
身份运算符包括 is 和 is not,用于判断两个变量是否引用内存中同一个对象(即内存地址是否相同,本质上是比对 id(x) == id(y))。
许多初学者容易混淆 == 与 is:
== 比较的是对象的内容值(Value)是否相等;
is 比较的是对象在内存中的身份标识(Identity)。
# 比较与身份判定的对比
x = [1, 2, 3]
y = [1, 2, 3]
z = x
print("x == y :", x == y) # True (值相同)
print("x is y :", x is y) # False (两个独立列表对象,内存地址不同)
print("x is z :", x is z) # True (指向同一块内存)
# 判断 None 的行业标准规范
target = None
if target is None: # 正确且推荐的书写方式
print("变量为 None")
八、运算符优先级与表达式推导步骤
当一个表达式中包含多种运算符时,Python 按照严格的优先级规则逐步计算。优先级高的运算符先计算;优先级相同时,绝大多数运算符按从左至右的结合性计算(幂运算符 ** 为右结合)。
工程编码建议:虽然 Python 具备详尽的运算符优先级判定规则,但在实际工程开发中,如果表达式超过两层逻辑组合,强烈建议使用小括号 () 显式指定运算顺序。这样不仅能彻底避免逻辑歧义,还能显著提升代码的可读性与团队协作维护效率。
九、总结与速查清单
梳理 Python 运算符体系时,可将关键规律归纳为以下四项原则:
- 数学除法选型:需要浮点精度用真除法
/,需要向下取整索引或分块时用//,处理循环周期用%。 - 短路利用需谨慎:
and与or返回的是决定结果的原操作数本身,可用于设置默认回退值(如val or default),但应避免将产生副作用的函数调用置于可能被短路的位置。 - 值比对与身份比对分开:比对对象数据是否一致始终使用
==;检查变量是否为单例或空值(如None、True、False)始终使用is。 - 集合加速检索:大规模频繁使用成员运算符
in之前,优先将列表或元组转换为set,将检索耗时从 O(n) 降低至 O(1)。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













