📌 引言:编程就是“算账”
你写代码是为了什么?归根结底,是为了处理数据——把一堆数字、字符串、布尔值经过各种运算,变成你想要的结果。而“运算”靠的就是运算符。
想象一下去超市购物:
- 买了 3 个苹果,每个 5 元 → 3 * 5(算术)
- 满 100 减 20 → 总价是否 ≥100?(比较)
- 会员再打 9 折 → if 会员 and 总价 > 50(逻辑)
运算符就是编程语言的“动词”。掌握它们,你的程序才能真正“动”起来。
本章我们就来彻底搞懂 Python 中的各种运算符,从加减乘除到身份比较,并学会如何优雅地组合它们。
一、算术运算符:数学课代表
Python 支持基本的数学运算,而且有些运算符比其他语言更贴心。
| + | 加法 | 10 + 3 | 13 |
| – | 减法 | 10 – 3 | 7 |
| * | 乘法 | 10 * 3 | 30 |
| / | 浮点除法 | 10 / 3 | 3.3333333333333335 |
| // | 整除(地板除) | 10 // 3 | 3 |
| % | 取余(模运算) | 10 % 3 | 1 |
| ** | 幂运算 | 2 ** 3 | 8 |
📌 特别关注:除法运算符
很多语言里,整数相除结果还是整数(截断),但 Python 的 / 永远返回浮点数。如果你想要整数结果,得用 //。
print(5 / 2) # 2.5
print(5 // 2) # 2
⚠️ 注意负数的 // 是向下取整(不是向零取整):
print(–5 // 2) # -3,因为 -2.5 向下取整是 -3
print(–5 / 2) # -2.5
取余 % 遵循公式:a = (a // b) * b + (a % b),所以结果的正负与除数有关:
print(–5 % 2) # 1,因为 -5 = (-3)*2 + 1
print(5 % –2) # -1,因为 5 = (-2)*(-2) + (-1)
✨ 冷知识:运算符也能用在字符串上
- + 可以拼接字符串
- * 可以重复字符串
print("Hello" + " " + "World") # Hello World
print("Ha" * 3) # HaHaHa
但 -、/ 等对字符串无效,别瞎试。
二、比较运算符:真假美猴王
比较运算符返回布尔值 True 或 False。
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
🔗 Python 特色:链式比较
这是 Python 非常优雅的特性——你可以把多个比较连起来写,就像数学里的 a < b < c。
x = 5
print(1 < x < 10) # True(等价于 1 < x and x < 10)
print(10 > x > 0) # True
甚至可以混搭:
print(3 < 5 == 5) # True(先比较 3<5 得 True,再比较 5==5 得 True,然后 True and True?不,其实是链式,相当于 3<5 and 5==5)
链式比较是逐个比较,中间用 and 连接,但比直接写 and 更简洁。
三、逻辑运算符:与或非
逻辑运算符用于组合布尔值,同样返回布尔值。
| and | 与(两者为真才真) | True and False | False |
| or | 或(一个为真就真) | True or False | True |
| not | 非(取反) | not True | False |
⚡ 短路求值(Short-circuit Evaluation)
Python 的逻辑运算符有“偷懒”行为:
- and:如果左边为 False,右边根本不会执行(因为结果已经确定是 False)
- or:如果左边为 True,右边不会执行
def risky():
print("执行了 risky 函数")
return True
print(False and risky()) # 不会输出任何东西,risky 没执行
print(True or risky()) # 也不会执行 risky
这个特性可以用来写简洁的条件判断,比如:
# 如果列表不为空,才访问第一个元素
if lst and lst[0] == 1:
print("第一个元素是1")
🧠 冷知识:逻辑运算符返回的不一定是布尔值
and 和 or 返回的是实际参与计算的值,而不是单纯的 True/False。
- x and y:如果 x 为假,返回 x;否则返回 y。
- x or y:如果 x 为真,返回 x;否则返回 y。
print(0 and 100) # 0(0 被视为假,返回 0)
print(3 and 5) # 5(3 为真,返回 5)
print(0 or 100) # 100(0 为假,返回 100)
print(3 or 5) # 3(3 为真,返回 3)
这在给变量赋默认值时很有用:
name = input("输入名字:") or "匿名用户" # 如果输入为空,name 就是 "匿名用户"
四、赋值复合运算符:偷懒的艺术
把算术运算符和赋值结合起来,可以少敲几个键。
| += | a += 1 | a = a + 1 |
| -= | a -= 1 | a = a – 1 |
| *= | a *= 2 | a = a * 2 |
| /= | a /= 2 | a = a / 2 |
| //= | a //= 2 | a = a // 2 |
| %= | a %= 2 | a = a % 2 |
| **= | a **= 2 | a = a ** 2 |
注意:这些运算符会改变变量本身(原地修改,但如果变量是不可变类型,实际上会重新绑定新对象)。
五、成员运算符:在不在?
检查一个值是否存在于一个序列(字符串、列表、元组、字典等)中。
| in | 存在 |
| not in | 不存在 |
print("a" in "hello") # False
print(3 in [1, 2, 3]) # True
print("name" in {"name": "Alice"}) # True(字典判断键是否存在)
print(4 not in (1, 2, 3)) # True
💡 实用技巧:用 in 简化复杂条件
代替长长的 if x == 1 or x == 2 or x == 3:
if x in (1, 2, 3):
print("x 是 1、2 或 3")
六、身份运算符:是不是同一个“人”?
身份运算符比较的是两个变量是否引用同一个对象(内存地址相同)。
| is | 是同一个对象 |
| is not | 不是同一个对象 |
🆚 is 与 == 的区别
- == 比较的是值是否相等
- is 比较的是身份(内存地址)是否相同
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True(值一样)
print(a is b) # False(不同对象)
c = a
print(c is a) # True(c 和 a 指向同一个列表)
⚠️ 使用建议
- 比较 None 时,必须用 is(这是 PEP 8 风格指南的建议)
- 比较布尔值时也用 is(if x is True),但通常直接用 if x 即可
result = None
if result is None:
print("没结果")
🪄 冷知识:小整数缓存
Python 为了优化,会缓存小整数对象(通常是 -5 到 256)。所以有时候两个不同的变量,只要值在这个范围内,is 比较也会是 True。
a = 256
b = 256
print(a is b) # True(被缓存了)
c = 257
d = 257
print(c is d) # False(超出缓存范围)
但永远不要依赖这个特性,用 is 比较整数是个坏习惯,应该用 ==。
七、位运算符(选读)
如果你不是做底层开发、网络协议或性能优化,位运算符可能很少用到。但了解一下也没坏处。
| & | 按位与 | 5 & 3 → 1(0101 & 0011 = 0001) |
| ` | ` | 按位或 |
| ^ | 按位异或 | 5 ^ 3 → 6(0101 ^ 0011 = 0110) |
| ~ | 按位取反 | ~5 → -6(取决于补码表示) |
| << | 左移 | 5 << 1 → 10(相当于乘以2) |
| >> | 右移 | 5 >> 1 → 2(相当于除以2取整) |
它们作用于整数的二进制位。日常开发中很少直接用,但面试可能会考。
八、运算符优先级:先算谁后算谁?
还记得小学的“先乘除后加减”吗?Python 也有自己的优先级规则。如果不想记,用括号强制指定顺序是最保险的。
📊 常见运算符优先级(从高到低)
| 1 | **(幂运算) |
| 2 | +x, -x, ~x(正负号、按位取反) |
| 3 | *, /, //, %(乘除取余) |
| 4 | +, -(加减) |
| 5 | <<, >>(移位) |
| 6 | &(按位与) |
| 7 | ^(按位异或) |
| 8 | ` |
| 9 | ==, !=, >, <, >=, <=, in, is(比较、成员、身份) |
| 10 | not(逻辑非) |
| 11 | and(逻辑与) |
| 12 | or(逻辑或) |
😵 容易出错的例子
print(2 + 3 * 4) # 14,不是 20
print(2 ** 3 ** 2) # 512,因为幂运算是右结合(2**(3**2)=2**9=512)
print(not True == False) # True?False?实际上 not True == False 等价于 not (True == False) → not False → True
最佳实践:当表达式复杂时,主动加括号:
print((2 + 3) * 4) # 20
print((not True) == False) # False(not True 是 False,False == False 是 True?等等,我写错了——应该是 (not True) == False 结果是 True?让我们一步步:not True 是 False,False == False 是 True。但如果不加括号,not True == False 相当于 not (True == False) → not False → True。两个结果一样?这里只是举例,总之括号能让你意图明确)
✅ 本章总结
| 算术 | + – * / // % ** | / 返回浮点,// 整除,% 取余,** 幂 |
| 比较 | == != > < >= <= | 可链式比较 1 < x < 5 |
| 逻辑 | and or not | 短路求值,返回实际值 |
| 赋值复合 | += -= *= /= //= %= **= | 简化代码 |
| 成员 | in not in | 检查存在性 |
| 身份 | is is not | 比较对象地址,None 用 is |
| 位 | `& | ^ ~ << >>` |
| 优先级 | 用括号明确顺序 | 避免歧义 |
记住:运算符是程序的动词,掌握了它们,你就能让数据动起来。
🚀 下集预告
学会了各种运算,下一步就是让程序根据条件做出选择,或者重复执行某些操作——这就是流程控制。
下一章我们将学习:
- if、elif、else 判断
- while 和 for 循环
- break、continue、else 循环伴侣
- Python 3.10+ 的新玩具:match 语句
敬请期待!🔥
网硕互联帮助中心





评论前必须登录!
注册