Python3 运算符

Python3 学习笔记 · 整理自菜鸟教程

一句话

运算符对操作数执行运算,Python 分为算术、比较、赋值、逻辑、位、成员和身份七大类。

要点

  • 算术运算符+ - * / % ** /// 结果为浮点,// 向下取整,** 是幂。
  • 比较运算符== != > < >= <=,返回布尔值。
  • 赋值运算符= += -= *= /= //= %= **=,以及海象运算符 :=
  • 逻辑运算符andornot,有短路特性。
  • 位运算符& | ^ ~ << >>,按二进制位运算。
  • 成员运算符innot in,判断元素是否在序列/集合中。
  • 身份运算符isis not,比较是否为同一对象(比内存地址)。
  • 优先级** > 一元 > * / // % > + - > 比较 > not > and > or。不确定就加括号。

语法 / 常用方法

运算符 说明 示例 结果
+ 3 + 2 5
- 3 - 2 1
* 3 * 2 6
/ 除(浮点) 7 / 2 3.5
// 整除(向下取整) 7 // 2 3
% 取模 7 % 2 1
** 2 ** 3 8
== 等于 1 == 1 True
!= 不等于 1 != 2 True
and 逻辑与(短路) True and False False
or 逻辑或(短路) True or False True
not 逻辑非 not True False
& | ^ ~ 位与/或/异或/取反 6 & 3 2
<< >> 左移/右移 1 << 2 4
in 成员判断 'a' in 'abc' True
is 身份判断 a is b 布尔
:= 海象赋值表达式 (n := 5) 5

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 算术运算符
print(7 / 2) # 3.5 真除法返回浮点
print(7 // 2) # 3 向下取整
print(-7 // 2) # -4 注意负数向下取整
print(7 % 2) # 1
print(2 ** 10) # 1024

# 比较运算符
print(1 == 1.0) # True 值相等
print(1 is 1.0) # False 不是同一对象(且类型不同)

# 赋值运算符
x = 10
x += 5 # 等价 x = x + 5
x //= 3
print(x) # 5

# 海象运算符:赋值并返回
data = [1, 2, 3, 4, 5]
if (n := len(data)) > 3:
print("长度超过 3:", n)

# 逻辑运算符:短路特性
def check():
print("check 被调用")
return True

print(False and check()) # False,check 不执行(短路)
print(True or check()) # True,check 不执行(短路)

# and/or 返回的是操作数,不一定是布尔值
print(0 or "默认值") # 默认值
print("a" and "b") # b

# 位运算符
print(6 & 3) # 2 110 & 011 = 010
print(6 | 3) # 7
print(6 ^ 3) # 5 异或
print(~6) # -7 按位取反
print(1 << 3) # 8 左移 = 乘 2^3
print(16 >> 2) # 4 右移 = 除 2^2

# 成员运算符
print("a" in "abc") # True
print(3 in [1, 2, 3]) # True
print("x" not in "abc") # True

# 身份运算符
a = [1, 2]
b = a # 同一对象
c = [1, 2] # 值相同但不同对象
print(a is b) # True
print(a is c) # False
print(a == c) # True

# 优先级:加括号更清晰
print(2 + 3 * 4) # 14
print((2 + 3) * 4) # 20
print(not 1 > 2) # True 等价 not (1 > 2)

易错点

  • / 总是返回 float4 / 22.0,要整数用 //
  • 负数整除方向// 向下取整,-7 // 2 == -4,不是 -3
  • ==is 不同== 比值,is 比身份;小整数和短字符串因缓存可能表现一致,别依赖。
  • and/or 返回操作数[] or 001 and 22,不一定是布尔。
  • 短路副作用:依赖短路时函数可能不被调用,别在右侧写必需执行的逻辑。
  • 优先级陷阱not a == b 等价 not (a == b),而位运算优先级低于比较,容易写错。
  • 海象运算符需括号:赋值表达式在条件中一般要加括号 (n := ...)
  • 可变对象身份:两个内容相同的列表 isFalse,判断内容用 ==