云计算百科
云计算领域专业知识百科平台

第三章|运算符与表达式:让 Python 帮你算账


📌 引言:编程就是“算账”

你写代码是为了什么?归根结底,是为了处理数据——把一堆数字、字符串、布尔值经过各种运算,变成你想要的结果。而“运算”靠的就是运算符。

想象一下去超市购物:

  • 买了 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 语句

敬请期待!🔥

赞(0)
未经允许不得转载:网硕互联帮助中心 » 第三章|运算符与表达式:让 Python 帮你算账
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!