简介:本文系统梳理 Python 七大类运算符——算术、赋值、比较、逻辑、身份、成员与位运算,通过可直接运行的代码示例,厘清 / 与 //、= 与 ==、is 与 == 等易混细节,并讲解优先级、短路求值与避坑要点,帮助你一次性建立完整准确的运算符知识框架。
Python 共有 7 个算术运算符:+、-、*、/、//、%、**。所有符号务必在英文(半角)输入状态下键入——中文标点是初学者最常踩的第一坑。
1. 除法的”真实身份”
+、-、* 与日常直觉一致,但 / 是”真除法”:即使两个整数整除,结果也是浮点数:
>>> 6 / 32.0
2. // 与 %:取整与取余的配合
// 是向下取整除法,永远向负无穷方向取整,而非像某些语言那样向零截断:
>>> 10 // 33>>> -10 // 3-4 # 注意是 -4,不是 -3
% 用于取余数,符号与除数保持一致,且满足恒等式 a == (a // b) * b + a % b:
>>> 10 % 31>>> -10 % 32
实践中,判断奇偶、周期性任务的取模、数据分桶,都离不开它:
if n % 2 == 0:print("偶数")
3. `` 幂运算**
两个星号表示”次方”,比调用函数更贴近数学书写习惯:
>>> 2 ** 101024>>> 9 ** 0.5 # 小数指数还能开根号3.0
4. 同一符号在不同类型上的行为
+ 用于字符串是”拼接”,* 用于序列是”重复”:
>>> "hello" + "world"'helloworld'>>> "ab" * 3'abab'>>> [1, 2] * 3[1, 2, 1, 2, 1, 2]
但 + 要求两侧类型一致,"1" + 1 会抛出 TypeError,需先用 str() 或 int() 显式转换。
5. 为什么 x++ 行不通
从其他语言迁移过来的习惯写法 x++ 在 Python 中是语法错误。有趣的是,++x 并不报错,它只是两个一元正号叠加,什么都不做:
>>> x = 5>>> ++x5 # +(+(5)),值不变>>> --x5 # -(-(5)),值也不变
因此在 Python 中,自增自减的标准写法是 x += 1 与 x -= 1。
1. = 的真正含义
= 不是数学意义上的”等于”,而是”把右边表达式的结果绑定到左边的名字上”。左边必须是可赋值目标:标识符、下标或属性。
2. 复合赋值家族
= 可与算术运算符组合成 +=、-=、*=、/=、//=、%=、**=,语义是”先运算,再回写”:
c = 1c += 1 # 等价于 c = c + 1,现为 2c += 1 # 再执行一次,再加 1,现为 3c *= 10 # 30c //= 7 # 4c **= 2 # 16
一个进阶细节:对列表等可变对象,+= 通常是原地扩展(等价于 extend),而 nums = nums + [3] 则创建新对象。当多个名字引用同一列表时,两者行为差异会直接显现。
3. 多重赋值、链式赋值与海象运算符
a, b = 1, 2 # 多重赋值(元组解包)a, b = b, a # 无需临时变量即可交换x = y = 0 # 链式赋值
Python 3.8 引入的海象运算符 := 允许在表达式内部赋值,避免”先计算再判断”的重复书写:
if (n := len("hello")) > 3:print(f"长度为 {n}") # 5
比较运算符包括 ==、!=、>、<、>=、<=,返回 True 或 False。
1. = 不等于 ==
= 是赋值,== 是相等性判断。写成 if x = 1: 会被 Python 直接拦下并报语法错误,这比某些语言”悄悄赋值导致逻辑错误”要友好得多。
2. 链式比较
Python 支持数学式的连写,等价于用 and 连接的两个条件,且中间操作数只求值一次:
>>> x = 5>>> 1 < x <= 10True
3. 布尔值可以参与算术
True 本质上是 1、False 是 0,因此可以直接做加法:
b = 1flag = b >= 1 # Trueprint(b + flag) # 1 + 1 = 2
4. 字符串按编码位比较
字符串逐字符按 Unicode 码点比较,ord() 可查询任意字符的码点(逆函数为 chr()):
>>> 'a' < 'b'True>>> ord('a'), ord('b')(97, 98)
这也是字符串排序、判断先后顺序的底层依据——'apple' < 'banana' 为 True。
and/or 的返回规律是初学者最易误解的细节:它们不一定返回布尔值。
1. 返回规则
a and b:先求 a,若 a 为假值,直接返回 a(短路);否则返回 b;a or b:先求 a,若 a 为真值,直接返回 a(短路);否则返回 b。
>>> 3 and 55 # 3 为真,返回右边>>> 0 and 50 # 0 为假,短路返回>>> "" or "default"'default'>>> "a" or "b"'a'
2. 真值判定
0、0.0、''、[]、{}、None、False 均为”假值”,其余皆为”真值”。
3. 短路求值的实践价值
左边已能决定结果时,右边根本不会执行,常用于安全访问:
if obj is not None and obj.count > 0:...
4. not 需谨慎
not 恒返回布尔值,但取反比较式时注意翻转关系:not a > b 等价于 a <= b,而非 a < b。
1. is 与 == 的区别
== 比较值是否相等,is 比较两个名字是否指向内存中同一个对象:
>>> a = [1, 2]>>> b = [1, 2]>>> a == bTrue>>> a is bFalse
注意:解释器通常缓存小整数(约 -5 到 256),但这属于实现细节,绝不能依赖它判断相等;判断 None 时应始终用 x is None。
2. in / not in
>>> "py" in "python"True>>> 3 in [1, 2, 3]True>>> "name" in {"name": "dev"}True # 对字典判断的是键
&(按位与)、|(或)、^(异或)、~(取反)、<<、>> 直接作用于整数的二进制位:
>>> 5 & 3 # 0101 & 0011 = 00011>>> 5 | 37>>> 5 ^ 36>>> 1 << 3 # 相当于乘 88>>> 16 >> 2 # 相当于除以 44>>> ~5 # 等于 -(5 + 1)-6
典型场景:用二进制位表示权限开关,一个整数同时携带多个标志的开关状态。
由高到低简记为:** → 一元正负、~ → *、/、//、% → +、- → 移位 → & → ^ → | → 比较运算符、is、in → not → and → or → 赋值。
>>> 2 + 3 * 4 ** 250>>> not True or True # 解析为 (not True) or TrueTrue
复杂表达式中建议显式加括号:跑得对不等于读得懂。
= 与 == 混写,条件中的赋值会被语法检查直接拦下;/ 与 //,需要整数结果时应显式处理;is 替代 ==,对象身份与值相等是两回事;x++ 不存在,应使用 x += 1;"1" + 1 报错,先做类型转换;and/or 返回布尔值,实际返回操作数本身;x = y = [] 会让两个名字指向同一列表,改其一则动全身。运算符是 Python 表达计算的最基础词汇。理解每个符号的语义边界、返回规律与优先级关系,比死记硬背符号表重要得多。建议在交互式解释器中逐条验证本文示例——亲手敲一遍的印象,远比读十遍更牢固。掌握这些细节后,你写出的条件判断与数值计算代码,将同时具备正确性与可读性。