Python 运算符全解析:七大类符号、语义与常见坑

作者:问答酱2026.11.07 01:39浏览量:0

简介:本文系统梳理 Python 七大类运算符——算术、赋值、比较、逻辑、身份、成员与位运算,通过可直接运行的代码示例,厘清 / 与 //、= 与 ==、is 与 == 等易混细节,并讲解优先级、短路求值与避坑要点,帮助你一次性建立完整准确的运算符知识框架。

一、算术运算符:不只是”加减乘除”

Python 共有 7 个算术运算符:+、-、*、/、//、%、**。所有符号务必在英文(半角)输入状态下键入——中文标点是初学者最常踩的第一坑。

1. 除法的”真实身份”

+、-、* 与日常直觉一致,但 / 是”真除法”:即使两个整数整除,结果也是浮点数:

  1. >>> 6 / 3
  2. 2.0

2. // 与 %:取整与取余的配合

// 是向下取整除法,永远向负无穷方向取整,而非像某些语言那样向零截断:

  1. >>> 10 // 3
  2. 3
  3. >>> -10 // 3
  4. -4 # 注意是 -4,不是 -3

% 用于取余数,符号与除数保持一致,且满足恒等式 a == (a // b) * b + a % b:

  1. >>> 10 % 3
  2. 1
  3. >>> -10 % 3
  4. 2

实践中,判断奇偶、周期性任务的取模、数据分桶,都离不开它:

  1. if n % 2 == 0:
  2. print("偶数")

3. `` 幂运算**

两个星号表示”次方”,比调用函数更贴近数学书写习惯:

  1. >>> 2 ** 10
  2. 1024
  3. >>> 9 ** 0.5 # 小数指数还能开根号
  4. 3.0

4. 同一符号在不同类型上的行为

+ 用于字符串是”拼接”,* 用于序列是”重复”:

  1. >>> "hello" + "world"
  2. 'helloworld'
  3. >>> "ab" * 3
  4. 'abab'
  5. >>> [1, 2] * 3
  6. [1, 2, 1, 2, 1, 2]

但 + 要求两侧类型一致,"1" + 1 会抛出 TypeError,需先用 str() 或 int() 显式转换。

5. 为什么 x++ 行不通

从其他语言迁移过来的习惯写法 x++ 在 Python 中是语法错误。有趣的是,++x 并不报错,它只是两个一元正号叠加,什么都不做:

  1. >>> x = 5
  2. >>> ++x
  3. 5 # +(+(5)),值不变
  4. >>> --x
  5. 5 # -(-(5)),值也不变

因此在 Python 中,自增自减的标准写法是 x += 1 与 x -= 1。

二、赋值运算符:给变量”赋予任务”

1. = 的真正含义

= 不是数学意义上的”等于”,而是”把右边表达式的结果绑定到左边的名字上”。左边必须是可赋值目标:标识符、下标或属性。

2. 复合赋值家族

= 可与算术运算符组合成 +=、-=、*=、/=、//=、%=、**=,语义是”先运算,再回写”:

  1. c = 1
  2. c += 1 # 等价于 c = c + 1,现为 2
  3. c += 1 # 再执行一次,再加 1,现为 3
  4. c *= 10 # 30
  5. c //= 7 # 4
  6. c **= 2 # 16

一个进阶细节:对列表等可变对象,+= 通常是原地扩展(等价于 extend),而 nums = nums + [3] 则创建新对象。当多个名字引用同一列表时,两者行为差异会直接显现。

3. 多重赋值、链式赋值与海象运算符

  1. a, b = 1, 2 # 多重赋值(元组解包)
  2. a, b = b, a # 无需临时变量即可交换
  3. x = y = 0 # 链式赋值

Python 3.8 引入的海象运算符 := 允许在表达式内部赋值,避免”先计算再判断”的重复书写:

  1. if (n := len("hello")) > 3:
  2. print(f"长度为 {n}") # 5

三、比较运算符:结果永远是布尔值

比较运算符包括 ==、!=、>、<、>=、<=,返回 True 或 False。

1. = 不等于 ==

= 是赋值,== 是相等性判断。写成 if x = 1: 会被 Python 直接拦下并报语法错误,这比某些语言”悄悄赋值导致逻辑错误”要友好得多。

2. 链式比较

Python 支持数学式的连写,等价于用 and 连接的两个条件,且中间操作数只求值一次:

  1. >>> x = 5
  2. >>> 1 < x <= 10
  3. True

3. 布尔值可以参与算术

True 本质上是 1、False 是 0,因此可以直接做加法:

  1. b = 1
  2. flag = b >= 1 # True
  3. print(b + flag) # 1 + 1 = 2

4. 字符串按编码位比较

字符串逐字符按 Unicode 码点比较,ord() 可查询任意字符的码点(逆函数为 chr()):

  1. >>> 'a' < 'b'
  2. True
  3. >>> ord('a'), ord('b')
  4. (97, 98)

这也是字符串排序、判断先后顺序的底层依据——'apple' < 'banana' 为 True。

四、逻辑运算符:and 与 or 的返回规律

and/or 的返回规律是初学者最易误解的细节:它们不一定返回布尔值。

1. 返回规则

  • a and b:先求 a,若 a 为假值,直接返回 a(短路);否则返回 b;
  • a or b:先求 a,若 a 为真值,直接返回 a(短路);否则返回 b。
  1. >>> 3 and 5
  2. 5 # 3 为真,返回右边
  3. >>> 0 and 5
  4. 0 # 0 为假,短路返回
  5. >>> "" or "default"
  6. 'default'
  7. >>> "a" or "b"
  8. 'a'

2. 真值判定

0、0.0、''、[]、{}、None、False 均为”假值”,其余皆为”真值”。

3. 短路求值的实践价值

左边已能决定结果时,右边根本不会执行,常用于安全访问:

  1. if obj is not None and obj.count > 0:
  2. ...

4. not 需谨慎

not 恒返回布尔值,但取反比较式时注意翻转关系:not a > b 等价于 a <= b,而非 a < b。

五、身份与成员运算符:is 与 in

1. is 与 == 的区别

== 比较值是否相等,is 比较两个名字是否指向内存中同一个对象:

  1. >>> a = [1, 2]
  2. >>> b = [1, 2]
  3. >>> a == b
  4. True
  5. >>> a is b
  6. False

注意:解释器通常缓存小整数(约 -5 到 256),但这属于实现细节,绝不能依赖它判断相等;判断 None 时应始终用 x is None。

2. in / not in

  1. >>> "py" in "python"
  2. True
  3. >>> 3 in [1, 2, 3]
  4. True
  5. >>> "name" in {"name": "dev"}
  6. True # 对字典判断的是键

六、位运算符

&(按位与)、|(或)、^(异或)、~(取反)、<<、>> 直接作用于整数的二进制位:

  1. >>> 5 & 3 # 0101 & 0011 = 0001
  2. 1
  3. >>> 5 | 3
  4. 7
  5. >>> 5 ^ 3
  6. 6
  7. >>> 1 << 3 # 相当于乘 8
  8. 8
  9. >>> 16 >> 2 # 相当于除以 4
  10. 4
  11. >>> ~5 # 等于 -(5 + 1)
  12. -6

典型场景:用二进制位表示权限开关,一个整数同时携带多个标志的开关状态。

七、运算符优先级

由高到低简记为:** → 一元正负、~ → *、/、//、% → +、- → 移位 → & → ^ → | → 比较运算符、is、in → not → and → or → 赋值。

  1. >>> 2 + 3 * 4 ** 2
  2. 50
  3. >>> not True or True # 解析为 (not True) or True
  4. True

复杂表达式中建议显式加括号:跑得对不等于读得懂。

八、易错点清单

  1. = 与 == 混写,条件中的赋值会被语法检查直接拦下;
  2. 混淆 / 与 //,需要整数结果时应显式处理;
  3. 用 is 替代 ==,对象身份与值相等是两回事;
  4. x++ 不存在,应使用 x += 1;
  5. 类型混用:"1" + 1 报错,先做类型转换;
  6. 误以为 and/or 返回布尔值,实际返回操作数本身;
  7. 对可变对象链式赋值:x = y = [] 会让两个名字指向同一列表,改其一则动全身。

结语

运算符是 Python 表达计算的最基础词汇。理解每个符号的语义边界、返回规律与优先级关系,比死记硬背符号表重要得多。建议在交互式解释器中逐条验证本文示例——亲手敲一遍的印象,远比读十遍更牢固。掌握这些细节后,你写出的条件判断与数值计算代码,将同时具备正确性与可读性。