Skip to content

Python 3 - 基本运算符

运算符(Operators)是 Python 中对值执行操作的特殊符号或关键字。运算符作用于的值称为操作数(operands)。例如,在表达式 5 + 3 中,+ 是运算符,5 和 3 是操作数。

Python 包含几种类别的运算符:

  • 算术运算符 (Arithmetic Operators)
  • 比较(关系)运算符 (Comparison (Relational) Operators)
  • 赋值运算符 (Assignment Operators)
  • 逻辑运算符 (Logical Operators)
  • 位运算符 (Bitwise Operators)
  • 成员运算符 (Membership Operators)
  • 身份运算符 (Identity Operators)

让我们来探讨每种类型。

这些运算符执行标准的数学运算。假设 a = 10 和 b = 3:

运算符名称描述示例 (a=10, b=3)
+加法将操作数相加。a + b 是 13
-减法从左操作数减去右操作数。a - b 是 7
*乘法将操作数相乘。a * b 是 30
/除法用左操作数除以右操作数(结果始终是浮点数)。a / b 是 3.333...
%取模返回除法的余数。a % b 是 1
**幂运算将左操作数提升到右操作数的幂。a ** b 是 1000
//整除执行除法并向下取整到最接近的整数。a // b 是 3。-10 // 3 是 -4。
#!/usr/bin/env python3
a = 10
b = 3
print(f"a + b = {a + b}")
print(f"a - b = {a - b}")
print(f"a * b = {a * b}")
print(f"a / b = {a / b}")
print(f"a % b = {a % b}")
print(f"a ** b = {a ** b}")
print(f"a // b = {a // b}")
print(f"-10 // 3 = {-10 // 3}") # 注意负数的整除

这些运算符比较两个值并返回一个布尔结果(True 或 False)。假设 a = 10 和 b = 20:

运算符名称描述示例 (a=10, b=20)
==等于检查值是否相等。a == b 是 False
!=不等于检查值是否不相等。a != b 是 True
>大于检查左操作数是否更大。a > b 是 False
<小于检查左操作数是否更小。a < b 是 True
>=大于或等于检查左操作数是否大于或等于。a >= b 是 False
<=小于或等于检查左操作数是否小于或等于。a <= b 是 True
#!/usr/bin/env python3
a = 10
b = 20
print(f"a == b: {a == b}")
print(f"a != b: {a != b}")
print(f"a > b: {a > b}")
print(f"a < b: {a < b}")
print(f"a >= b: {a >= b}")
print(f"a <= b: {a <= b}")

这些运算符将值赋给变量(variables)。基本赋值运算符是 =. 复合赋值运算符(Combined operators)在一个步骤中执行操作并赋值结果。假设 c 最初是 10 进行复合赋值:

运算符示例等价于
=x = 5x = 5
+=c += 5c = c + 5 (c 变为 15)
-=c -= 3c = c - 3 (c 变为 7)
*=c *= 2c = c * 2 (c 变为 20)
/=c /= 4c = c / 4 (c 变为 2.5)
%=c %= 3c = c % 3 (c 变为 1)
**=c **= 3c = c ** 3 (c 变为 1000)
//=c //= 3c = c // 3 (c 变为 3)
#!/usr/bin/env python3
c = 10
print(f"Initial c: {c}") # 初始 c
c += 5
print(f"After c += 5: {c}") # c += 5 后
c //= 6
print(f"After c //= 6: {c}") # c //= 6 后

这些运算符组合条件语句(conditional statements)并返回 True 或 False。假设 x = True 和 y = False:

运算符描述示例 (x=True, y=False)
and如果两个操作数都为真,则返回 True。x and y 是 False
or如果至少一个操作数为真,则返回 True。x or y 是 True
not反转逻辑状态(True 变为 False,False 变为 True)。not x 是 False

逻辑运算符使用短路评估(short-circuiting):and 在第一个操作数为假时停止评估;or 在第一个操作数为真时停止评估。

#!/usr/bin/env python3
age = 25
has_permission = False
if age >= 18 and has_permission:
print("Access granted.") # 访问被授权
else:
print("Access denied.") # 访问被拒绝
if age < 18 or age > 65:
print("Eligible for discount.") # 符合折扣条件
else:
print("Standard price applies.") # 适用标准价格
print(f"Not has_permission: {not has_permission}") # has_permission 的非

这些运算符测试某个值是否存在于序列(sequence)(如列表、元组、字符串)中。假设 my_list = [1, 2, 3]:

运算符描述示例 (my_list = [1, 2, 3])
in如果值在序列中找到,则返回 True。2 in my_list 是 True
not in如果值不在序列中找到,则返回 True。4 not in my_list 是 True
#!/usr/bin/env python3
my_list = [1, 2, 3, 'a', 'b']
name = "Python"
print(f"Is 3 in my_list? {3 in my_list}") # 3 在 my_list 中吗?
print(f"Is 'c' not in my_list? {'c' not in my_list}") # 'c' 不在 my_list 中吗?
print(f"Is 'th' in name? {'th' in name}") # 'th' 在 name 中吗?

这些运算符比较两个对象的内存地址(memory locations),检查它们是否是完全相同的对象(object),而不仅仅是值相等。

运算符描述示例
is如果两个变量指向同一个对象,则返回 True。x is y
is not如果变量指向不同的对象,则返回 True。x is not y

使用 is 时要小心。对于像整数(较小的)和字符串这样的不可变类型(immutable types),Python 可能会重用对象,导致 is 意外地返回 True。它主要用于检查单例(singletons),如 None。

#!/usr/bin/env python3
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(f"a == b: {a == b}") # True (值相等)
print(f"a is b: {a is b}") # False (内存中的不同对象)
print(f"a == c: {a == c}") # True (值相等)
print(f"a is c: {a is c}") # True (指向同一个对象)
# 'is' 的常见用例
value = None
if value is None:
print("Value is None")
if value is not None:
print("Value is not None")

这些运算符直接对整数的二进制(位)表示执行操作。它们在一般脚本中不那么常见,但在特定领域(如低级编程或数据操作)中使用。假设 a = 60 (0011 1100) 和 b = 13 (0000 1101):

运算符名称描述示例 (a=60, b=13)
&按位与如果对应的两个位都是 1,则将该位设置为 1。a & b 是 12 (0000 1100)
|按位或如果对应的两个位中至少有一个是 1,则将该位设置为 1。a | b 是 61 (0011 1101)
^按位异或如果对应的两个位中只有一个是 1,则将该位设置为 1。a ^ b 是 49 (0011 0001)
~按位非(补码)反转所有位(0 变为 1,1 变为 0)。结果取决于有符号表示。~a 是 -61
<<左移将位左移,用零填充(乘以 2^n)。a << 2 是 240 (1111 0000)
>>右移将位右移(除以 2^n,丢弃余数)。a >> 2 是 15 (0000 1111)

你可以使用内置的 bin() 函数查看二进制表示:

#!/usr/bin/env python3
a = 60
b = 13
print(f"a = {a} ({bin(a)}), b = {b} ({bin(b)})") # a = 60 (0b111100), b = 13 (0b1101)
print(f"a & b = {a & b} ({bin(a & b)})") # a & b = 12 (0b1100)
print(f"a | b = {a | b} ({bin(a | b)})") # a | b = 61 (0b111101)
print(f"a ^ b = {a ^ b} ({bin(a ^ b)})") # a ^ b = 49 (0b110001)
print(f"~a = {~a} ({bin(~a)}) # 注意:使用补码表示")
print(f"a << 2 = {a << 2} ({bin(a << 2)})") # a 左移 2 位
print(f"a >> 2 = {a >> 2} ({bin(a >> 2)})") # a 右移 2 位

当表达式包含多个运算符时,Python 遵循特定的优先级顺序来确定先执行哪个操作。括号 () 可以用来覆盖这个顺序。

下表列出了从最高优先级(最先执行)到最低优先级的运算符:

优先级运算符描述
最高()括号
**幂运算
+x, -x, ~x一元加、减、按位非
*, /, //, %乘法、除法、整除、取模
+, -加法、减法
<<, >>位移
&按位与
^按位异或
|按位或
in, not in, is, is not, <, <=, >, >=, !=, ==比较、成员、身份运算符
not x逻辑非
and逻辑与
最低or逻辑或

示例:

#!/usr/bin/env python3
result = 5 + 3 * 2 # 乘法 (*) 的优先级高于加法 (+)
print(f"5 + 3 * 2 = {result}") # 输出: 11
result = (5 + 3) * 2 # 括号覆盖了优先级
print(f"(5 + 3) * 2 = {result}") # 输出: 16
result = 10 / 2 + 3 # 除法 (/) 的优先级高于加法 (+)
print(f"10 / 2 + 3 = {result}") # 输出: 8.0