第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) # 输出:5123. 一元运算符 +x, -x, ~x
一元运算符只对一个操作数进行运算。
# 正号
x = +5
print(x) # 输出:5
# 负号
y = -5
print(y) # 输出:-5
# 按位取反
z = ~5 # ~x = -x - 1
print(z) # 输出:-64. 乘、除、整除、取余
这些运算符的优先级相同,从左到右计算。
# 乘法
print(3 * 4) # 输出:12
# 除法
print(10 / 3) # 输出:3.3333...
# 整除
print(10 // 3) # 输出:3
# 取余
print(10 % 3) # 输出:1
# 组合运算
result = 10 / 2 * 5 # 从左到右:先除后乘
print(result) # 输出:25.05. 加、减
加法和减法优先级相同,从左到右计算。
# 加法
print(5 + 3) # 输出:8
# 减法
print(10 - 4) # 输出:6
# 组合运算
result = 10 + 5 - 3 # 从左到右
print(result) # 输出:126. 按位移位运算符 <<, >>
用于对整数的二进制位进行左移或右移。
# 左移:相当于乘以2的幂
print(5 << 2) # 5 * 2^2 = 20
# 右移:相当于整除以2的幂
print(20 >> 2) # 20 // 2^2 = 57. 按位与、异或、或
这些是二进制位运算符。
# 按位与
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]) # True9. 逻辑运算符
逻辑运算符用于布尔运算。
# 逻辑非
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
本集小结
- 运算符优先级决定了表达式中运算的执行顺序
- 括号具有最高优先级,可以改变默认的运算顺序
- 幂运算是唯一从右到左计算的运算符
- 逻辑运算符优先级:
not>and>or - 比较运算符的优先级低于算术运算符
- 使用括号可以避免优先级混乱
- 将复杂表达式分解可以提高代码可读性
课后练习
练习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编程中最重要的流程控制语句之一。通过条件语句,我们可以让程序根据不同的条件执行不同的代码,实现智能化的判断和决策。
敬请期待!