第10集:运算符优先级

本集学习目标

  • 理解运算符优先级的概念
  • 掌握Python中各类运算符的优先级规则
  • 学会使用括号明确运算顺序
  • 通过实际练习巩固运算符优先级的使用

什么是运算符优先级?

运算符优先级决定了在一个包含多个运算符的表达式中,运算的执行顺序。优先级高的运算符会先被计算,优先级低的运算符后被计算。

例如,在表达式 2 + 3 * 4 中,由于乘法运算符 * 的优先级高于加法运算符 +,所以会先计算 3 * 4 = 12,然后计算 2 + 12 = 14,结果是 14,而不是 20

Python运算符优先级表(从高到低)

优先级 运算符 描述
1 () 括号(最高优先级)
2 ** 幂运算
3 +x, -x, ~x 正号、负号、按位取反(一元运算符)
4 *, /, //, % 乘、除、整除、取余
5 +, - 加、减
6 <<, >> 按位左移、右移
7 & 按位与
8 ^ 按位异或
9 | 按位或
10 in, not in, is, is not, <, <=, >, >=, <>, !=, == 比较、身份、成员运算
11 not 逻辑非
12 and 逻辑与
13 or 逻辑或
14 lambda Lambda表达式

重要提示:同一优先级的运算符从左到右计算(幂运算 ** 除外,它是从右到左计算)。

详细讲解各类运算符

1. 括号 () - 最高优先级

括号用于改变运算顺序,括号内的表达式总是优先计算。

# 不使用括号
result1 = 2 + 3 * 4  # 14,先算乘法
print(result1)

# 使用括号
result2 = (2 + 3) * 4  # 20,先算括号内的加法
print(result2)

2. 幂运算 **

幂运算符用于计算一个数的幂。

# 幂运算从右到左计算
result = 2 ** 3 ** 2  # 相当于 2 ** (3 ** 2) = 2 ** 9 = 512
print(result)  # 输出:512

3. 一元运算符 +x, -x, ~x

一元运算符只对一个操作数进行运算。

# 正号
x = +5
print(x)  # 输出:5

# 负号
y = -5
print(y)  # 输出:-5

# 按位取反
z = ~5  # ~x = -x - 1
print(z)  # 输出:-6

4. 乘、除、整除、取余

这些运算符的优先级相同,从左到右计算。

# 乘法
print(3 * 4)  # 输出:12

# 除法
print(10 / 3)  # 输出:3.3333...

# 整除
print(10 // 3)  # 输出:3

# 取余
print(10 % 3)  # 输出:1

# 组合运算
result = 10 / 2 * 5  # 从左到右:先除后乘
print(result)  # 输出:25.0

5. 加、减

加法和减法优先级相同,从左到右计算。

# 加法
print(5 + 3)  # 输出:8

# 减法
print(10 - 4)  # 输出:6

# 组合运算
result = 10 + 5 - 3  # 从左到右
print(result)  # 输出:12

6. 按位移位运算符 <<, >>

用于对整数的二进制位进行左移或右移。

# 左移:相当于乘以2的幂
print(5 << 2)  # 5 * 2^2 = 20

# 右移:相当于整除以2的幂
print(20 >> 2)  # 20 // 2^2 = 5

7. 按位与、异或、或

这些是二进制位运算符。

# 按位与
print(5 & 3)  # 5(101) & 3(011) = 1(001)

# 按位异或
print(5 ^ 3)  # 5(101) ^ 3(011) = 6(110)

# 按位或
print(5 | 3)  # 5(101) | 3(011) = 7(111)

8. 比较、身份、成员运算

这些运算符用于比较两个值。

# 比较运算
print(5 > 3)  # True
print(5 == 5)  # True
print(5 != 3)  # True

# 身份运算符
x = [1, 2, 3]
y = [1, 2, 3]
print(x is y)  # False(不同的对象)
print(x is not y)  # True

# 成员运算符
print(3 in [1, 2, 3])  # True
print(4 not in [1, 2, 3])  # True

9. 逻辑运算符

逻辑运算符用于布尔运算。

# 逻辑非
print(not True)  # False
print(not False)  # True

# 逻辑与(短路与)
print(True and True)  # True
print(True and False)  # False

# 逻辑或(短路或)
print(True or False)  # True
print(False or False)  # False

# 逻辑运算符优先级示例
result = True or False and False  # 等价于 True or (False and False)
print(result)  # True,因为or优先级低于and

运算符优先级实际案例

案例1:混合运算

# 复杂表达式分析
result = 2 + 3 * 4 ** 2 - 1

# 计算过程:
# 1. 幂运算:4 ** 2 = 16
# 2. 乘法:3 * 16 = 48
# 3. 加法:2 + 48 = 50
# 4. 减法:50 - 1 = 49

print(result)  # 输出:49

案例2:逻辑运算符组合

# 逻辑运算符优先级
x = True
y = False
z = True

# 先算not,再算and,最后算or
result = x or not y and z
# 计算过程:
# 1. not y = True
# 2. True and z = True
# 3. x or True = True

print(result)  # 输出:True

案例3:比较和逻辑运算符

# 比较和逻辑运算符的组合
x = 5
y = 10
z = 15

result = x < y and y < z
print(result)  # 输出:True(5 < 10 < 15)

案例4:整除和取余

# 整除和取余的组合运算
number = 17
hours = number // 60
minutes = number % 60
print(f"{hours}小时{minutes}分钟")  # 输出:0小时17分钟

如何避免优先级混乱?

使用括号明确运算顺序

当表达式的优先级不清晰时,使用括号是最安全的方式。

# 不清晰的表达式
result1 = 2 + 3 * 4  # 可能有人会误以为是20

# 使用括号明确
result2 = 2 + (3 * 4)  # 明确表示先算乘法
result3 = (2 + 3) * 4  # 明确表示先算加法

将复杂表达式分解

将复杂表达式分解为多个简单的表达式,提高可读性。

# 复杂表达式
result = (a + b) * (c - d) / (e ** 2)

# 分解为多行
temp1 = a + b
temp2 = c - d
temp3 = e ** 2
result = temp1 * temp2 / temp3

常见错误与注意事项

错误1:误判优先级

# 错误:以为会先算加法
result = 2 + 3 * 4  # 结果是14,不是20

解决方法:使用括号明确运算顺序 (2 + 3) * 4 = 20

错误2:逻辑运算符优先级混乱

# 错误:误以为or优先级高于and
result = True or False and False  # 结果是True,不是False

解决方法:使用括号 True or (False and False)

错误3:幂运算的右结合性

# 错误:以为是从左到右计算
result = 2 ** 3 ** 2  # 结果是512(2**9),不是64(8**2)

解决方法:使用括号 (2 ** 3) ** 2 = 64

本集小结

  1. 运算符优先级决定了表达式中运算的执行顺序
  2. 括号具有最高优先级,可以改变默认的运算顺序
  3. 幂运算是唯一从右到左计算的运算符
  4. 逻辑运算符优先级:not > and > or
  5. 比较运算符的优先级低于算术运算符
  6. 使用括号可以避免优先级混乱
  7. 复杂表达式分解可以提高代码可读性

课后练习

练习1:计算表达式

不使用Python,手动计算以下表达式的结果:

a) 2 + 3 * 4 - 1
b) (2 + 3) * 4 - 1
c) 2 + 3 * (4 - 1)
d) 10 / 2 + 3 * 5
e) 10 / (2 + 3) * 5

练习2:添加括号

为以下表达式添加括号,使其按照不同的顺序计算,并说明结果:

result = 5 + 3 * 2 ** 2 - 1

练习3:逻辑表达式

分析以下逻辑表达式并写出计算过程:

a) True or False and True
b) not True and False or True
c) True and not False or False

练习4:编程练习

编写一个程序,计算并显示以下表达式的结果:

# 要求:先计算预期结果,然后用Python验证
expr1 = (10 + 5) * (3 - 1) / 2
expr2 = 10 + 5 * 3 - 1 / 2
expr3 = 2 ** 3 ** 2
expr4 = (2 ** 3) ** 2

下集预告

下一集我们将学习第11集:if条件语句基础,这是Python编程中最重要的流程控制语句之一。通过条件语句,我们可以让程序根据不同的条件执行不同的代码,实现智能化的判断和决策。

敬请期待!

« 上一篇 赋值运算符 下一篇 » if条件语句基础