目录
4. 逻辑非(not) > 逻辑与(and) > 逻辑或(or)
以下是由浅入深、全面系统的 Python 运算符知识点总结,涵盖基础概念、进阶用法、典型场景及实战技巧,附带案例和逻辑解析:
一、运算符分类概览
Python 运算符分为 7 大类,按优先级从高到低排列:
类别 | 运算符示例 | 优先级顺序 | |
---|---|---|---|
算术运算符 | + , - , * , ** , // | 最高(括号优先) | |
位运算符 | & , ` | , ^, <<, >>` | 次高 |
比较运算符 | == , != , > , < , >= | 中等 | |
布尔运算符 | not , and , or | 较低 | |
赋值运算符 | = , += , %= , := | 最低 | |
成员运算符 | in , not in | 中等 | |
身份运算符 | is , is not | 中等 |
二、核心运算符详解
1. 算术运算符
a, b = 10, 3
print(a + b) # 13 → 加法
print(a - b) # 7 → 减法
print(a * b) # 30 → 乘法
print(a / b) # 3.333... → 浮点除法
print(a // b) # 3 → 整除(向下取整)
print(a % b) # 1 → 取余(余数符号与除数一致)
print(a ** b) # 1000 → 幂运算
注意事项:
-
负数整除:
-10 // 3 = -4
(向下取整) -
浮点精度陷阱:
0.1 + 0.2 != 0.3
(用Decimal
模块解决)
2. 比较运算符
x, y = 5, 7
print(x == y) # False → 等于
print(x != y) # True → 不等于
print(x > y) # False → 大于
print(x <= y) # True → 小于等于
# 链式比较(Python 独有)
print(1 < x < 10) # True → 等价于 1 < x and x < 10
3. 逻辑运算符
a, b = True, False
print(a and b) # False → 逻辑与(全真为真)
print(a or b) # True → 逻辑或(一真即真)
print(not a) # False → 逻辑非
# 短路求值特性
def check():
print("函数执行")
return True
print(False and check()) # 输出 False,函数未执行
print(True or check()) # 输出 True,函数未执行
4. 位运算符(二进制级操作)
a = 0b1010 # 10
b = 0b1100 # 12
print(bin(a & b)) # 0b1000 → 按位与(同1为1)
print(bin(a | b)) # 0b1110 → 按位或(有1为1)
print(bin(a ^ b)) # 0b0110 → 按位异或(不同为1)
print(bin(~a)) # -0b1011 → 按位取反(补码表示)
print(a << 2) # 40 → 左移两位(相当于乘4)
print(b >> 1) # 6 → 右移一位(相当于整除2)
应用场景:
-
权限系统(用位掩码组合权限)
-
高性能算法优化(如布隆过滤器)
5. 赋值运算符
(1) 基础赋值
x = 5
x += 3 # x = 8
x **= 2 # x = 64
(2) 海象运算符 :=
(Python 3.8+)
# 在表达式内部赋值
if (n := len("hello")) > 3:
print(n) # 输出: 5
# 简化循环读取操作
while (line := input()) != "quit":
print(line)
6. 成员运算符
lst = [1, 2, 3]
dct = {"name": "Alice", "age": 30}
print(2 in lst) # True → 检查元素存在性
print("name" in dct) # True → 检查字典键
print("Alice" in dct) # False → 不检查字典值
7. 身份运算符
a = [1, 2]
b = [1, 2]
c = a
print(a == b) # True → 值相等
print(a is b) # False → 不同对象
print(a is c) # True → 同一对象
# 小整数池优化(-5~256)
x, y = 256, 256
print(x is y) # True → 缓存复用
x, y = 257, 257
print(x is y) # False → 新建对象
三、高级技巧与陷阱
1. 运算符优先级问题
result = 5 + 3 * 2 ** 2 # 5 + (3*(2^2)) = 17
result = (5 + 3) * 2 ** 2 # (8)*4 = 32 → 用括号明确优先级
2. 运算符重载(面向对象)
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(4, 5)
print(v1 + v2) # 输出: (6, 8)
3. 特殊场景处理
# 空值判断
val = None
print(val is None) # True → 正确判断空值
# 避免 is 误用
a = 1000
b = 1000
print(a == b) # True
print(a is b) # False(超出小整数池范围)
四、应用场景总结
运算符类型 | 典型应用场景 | 性能优势 |
---|---|---|
算术运算符 | 数学计算、数据转换 | 基础运算高效 |
位运算符 | 二进制处理、权限系统 | 极高性能 |
成员运算符 | 容器元素检查、字典键验证 | 快速查找 |
海象运算符 | 简化循环和条件表达式 | 代码简洁 |
运算符重载 | 自定义对象操作(如向量运算) | 提高代码可读性 |
五、最佳实践
-
优先使用
==
而非is
:除非明确需要检查对象身份 -
活用括号明确优先级:避免隐式运算顺序导致错误
-
注意可变对象操作:如
+=
对列表的原地修改lst = [1, 2] lst += [3] # 原地修改 → lst = [1, 2, 3] lst = lst + [4] # 创建新对象 → 效率较低
-
防御性编程:对可能为
None
的值使用is None
判断
掌握这些知识点后,您将能:
-
写出更高效、易读的 Python 代码
-
避免常见的运算符使用陷阱
-
在算法优化和面向对象编程中灵活运用运算符特性
运算符 优先级 知识点总结
Python 运算符优先级知识点总结精讲
一、优先级总览(从高到低)
以下是常见运算符优先级排序,括号 ()
始终具有最高优先级:
优先级 | 运算符类别 | 运算符示例 | |
---|---|---|---|
1 | 括号 | () | |
2 | 幂运算 | ** | |
3 | 按位取反、算术符号 | ~x , +x , -x (正负号) | |
4 | 乘、除、取余、整除 | * , / , % , // | |
5 | 加、减 | + , - | |
6 | 位移运算 | << , >> | |
7 | 按位与 | & | |
8 | 按位异或 | ^ | |
9 | 按位或 | ` | ` |
10 | 比较运算符 | == , != , < , > , <= , >= | |
11 | 身份运算符 | is , is not | |
12 | 成员运算符 | in , not in | |
13 | 逻辑非 | not | |
14 | 逻辑与 | and | |
15 | 逻辑或 | or | |
16 | 赋值运算符 | = , += , -= , := (海象运算符) |
二、关键优先级规则详解
1. 括号优先级最高
result = (3 + 5) * 2 # 先计算括号内 → 8 * 2 = 16
print(result) # 输出: 16
2. 幂运算(**
)高于乘除
result = 3 + 5 ** 2 * 2 # 等价于 3 + (25 * 2) = 53
print(result) # 输出: 53
3. 乘除优先级高于加减
result = 5 + 3 * 2 - 4 / 2 # 等价于 5 + 6 - 2.0 = 9.0
print(result) # 输出: 9.0
4. 逻辑非(not
) > 逻辑与(and
) > 逻辑或(or
)
print(not True and False) # 等价于 (not True) and False → False
print(False or True and True) # 等价于 False or (True and True) → True
5. 比较运算符 > 身份/成员运算符 > 逻辑运算符
x = 5
print(1 < x < 10 and x is not None) # 等价于 (1 < x < 10) and (x is not None) → True
6. 赋值运算符优先级最低
a = 5
a += 3 * 2 # 等价于 a = a + (3 * 2) → 5 + 6 = 11
print(a) # 输出: 11
三、常见优先级陷阱与案例
陷阱1:逻辑运算符优先级混淆
# 预期:若 x 不在 [1,3] 区间则输出 False
x = 2
print(not x > 1 and x < 3) # 实际等价于 (not (x > 1)) and (x < 3) → False
# 正确写法:
print(not (x > 1 and x < 3)) # 输出: False(但逻辑意图更明确)
陷阱2:位移与算术运算混淆
print(8 >> 1 + 1) # 等价于 8 >> (1 + 1) → 8 >> 2 = 2(不是 (8 >> 1) + 1 = 5)
陷阱3:海象运算符的优先级
# 海象运算符 := 的优先级仅高于赋值运算符
if (n := 5) > 3 and n < 10: # 正确写法:括号明确优先级
print(n) # 输出: 5
四、最佳实践与注意事项
-
优先使用括号
即使知道默认优先级,显式括号能提升代码可读性:# 模糊写法 result = x * 2 + y ** 3 / z # 清晰写法 result = (x * 2) + ((y ** 3) / z)
-
避免复杂表达式
拆分多步运算,避免单行代码包含过多运算符:# 不推荐 total = a + b * c - d / e + f ** g # 推荐 temp1 = b * c temp2 = d / e temp3 = f ** g total = a + temp1 - temp2 + temp3
-
注意运算符结合性
同级运算符按从左到右顺序计算(幂运算**
除外,从右到左):print(2 ** 3 ** 2) # 等价于 2^(3^2) = 512(不是 (2^3)^2 = 64)
-
特殊值的优先级处理
如None
判断应使用is
而非==
:val = None print(val is None) # True(正确) print(val == None) # True(但可能触发 __eq__ 重载问题)
五、优先级应用场景总结
场景 | 关键运算符优先级 | 示例 |
---|---|---|
数学公式计算 | 括号 > 幂 > 乘除 > 加减 | (a + b) * c ** 2 |
条件判断组合 | 比较 > 逻辑非 > 逻辑与 > 逻辑或 | x > 5 and not y or z |
位操作与算术混合 | 位移 > 按位与/或 > 算术运算 | (a << 2) & 0xFF + b |
容器操作与逻辑判断 | 成员检查 > 逻辑运算符 | key in dct and dct[key] > 0 |
掌握运算符优先级,能帮助您:
-
编写更高效、准确的代码
-
快速定位表达式计算顺序错误
-
提升代码可读性和维护性