pin_drop当前位置:知识文库 ❯ 图文
Python运算符优先级
概述
当一个表达式中包含多种运算符时,Python会按照预定义的优先级规则决定运算的执行顺序。理解运算符优先级是编写正确表达式的基础,可以避免因运算顺序不当导致的逻辑错误。本节将详细介绍Python运算符的优先级规则、优先级表格以及使用括号改变优先级的方法。
优先级规则
Python运算符优先级遵循以下基本原则:
-
优先级高的先运算:优先级高的运算符先执行,优先级低的后执行
-
相同优先级从左到右:大多数运算符从左到右依次运算(左结合)
-
幂运算从右到左:
**运算符是右结合的 -
括号最优先:括号内的表达式最先运算
基本优先级顺序(从高到低)
括号 → 幂运算 → 正负号 → 乘除取模整除 → 加减 → 位移 → 按位与 → 按位异或 → 按位或 → 比较运算 → 成员运算 → 身份运算 → 逻辑非 → 逻辑与 → 逻辑或 → 条件表达式 → 赋值 → 海象运算符
优先级表格
记忆口诀
为了方便记忆,可以按照以下简化顺序:
记忆口诀:括号 → 幂 → 正负号 → 乘除 → 加减 → 位移 → 位运算(与→异或→或) → 比较 → 身份 → 成员 → 逻辑(非→与→或) → 赋值
括号改变优先级
括号是改变运算顺序的最直接方式,括号内的表达式总是最先运算。
基本用法
代码示例
print(2 + 3 * 4)
print((2 + 3) * 4)输出:
代码示例
14
20嵌套括号
代码示例
result = (2 + (3 * (4 + 5)))
print(result)输出:
代码示例
29逻辑表达式中的括号
代码示例
a = True
b = False
c = True
print(a or b and c)
print((a or b) and c)输出:
代码示例
True
True另一个例子:
代码示例
a = False
b = True
c = True
print(a or b and c)
print((a or b) and c)输出:
代码示例
True
True再看一个区分更明显的例子:
代码示例
print(not True or True)
print(not (True or True))输出:
代码示例
True
False复杂表达式
代码示例
x = 5
y = 3
z = 2
result1 = x + y * z ** 2
result2 = (x + y) * z ** 2
result3 = ((x + y) * z) ** 2
print(f"x + y * z ** 2 = {result1}")
print(f"(x + y) * z ** 2 = {result2}")
print(f"((x + y) * z) ** 2 = {result3}")输出:
代码示例
x + y * z ** 2 = 17
(x + y) * z ** 2 = 32
((x + y) * z) ** 2 = 256代码示例
示例1:算术表达式优先级
代码示例
print(f"2 + 3 * 4 = {2 + 3 * 4}")
print(f"(2 + 3) * 4 = {(2 + 3) * 4}")
print(f"2 ** 3 ** 2 = {2 ** 3 ** 2}")
print(f"(2 ** 3) ** 2 = {(2 ** 3) ** 2}")
print(f"-3 ** 2 = {-3 ** 2}")
print(f"(-3) ** 2 = {(-3) ** 2}")输出:
代码示例
2 + 3 * 4 = 14
(2 + 3) * 4 = 20
2 ** 3 ** 2 = 512
(2 ** 3) ** 2 = 64
-3 ** 2 = -9
(-3) ** 2 = 9
2 ** 3 ** 2是右结合,等价于2 ** (3 ** 2) = 2 ** 9 = 512。
-3 ** 2中**优先级高于负号,等价于-(3 ** 2) = -9。
示例2:比较与逻辑运算
代码示例
x = 10
result1 = x > 5 and x < 20
result2 = 5 < x < 20
print(f"x > 5 and x < 20: {result1}")
print(f"5 < x < 20: {result2}")
a = True
b = False
c = True
result3 = not a or b and c
result4 = (not a) or (b and c)
result5 = not (a or b) and c
print(f"not a or b and c: {result3}")
print(f"(not a) or (b and c): {result4}")
print(f"not (a or b) and c: {result5}")示例3:位运算与比较
代码示例
x = 5
y = 3
result1 = x & y + 1
result2 = (x & y) + 1
print(f"x & y + 1 = {result1}")
print(f"(x & y) + 1 = {result2}")
result3 = x | y > 2
result4 = (x | y) > 2
print(f"x | y > 2 = {result3}")
print(f"(x | y) > 2 = {result4}")示例4:综合表达式
代码示例
score = 85
attendance = 90
has_project = True
pass_condition = (score >= 60 and attendance >= 80) or has_project
excellent_condition = score >= 90 and attendance >= 95 and has_project
print(f"是否通过: {pass_condition}")
print(f"是否优秀: {excellent_condition}")注意事项
多用括号:即使你清楚优先级规则,在复杂表达式中也建议使用括号,提高代码可读性。
幂运算是右结合:
2 ** 3 ** 2等于2 ** 9 = 512,不是8 ** 2 = 64。
负号与幂运算:
-3 ** 2等于-9,因为**优先级高于负号。要得到9需写(-3) ** 2。
比较运算可以链式:
1 < x < 10比1 < x and x < 10更简洁且效率更高。
赋值运算优先级最低:赋值运算符优先级低于几乎所有其他运算符,因此
x = 2 + 3 * 4会先计算右边再赋值。
避免过长的表达式:如果表达式过于复杂,考虑拆分为多步,使用中间变量。
小结
本节我们学习了:
-
优先级规则:优先级高的先运算,相同优先级从左到右(幂运算从右到左)
-
优先级表格:从高到低依次为括号、幂、正负号、乘除、加减、位移、位运算、比较、身份、成员、逻辑、赋值
-
括号改变优先级:使用括号可以明确运算顺序,提高可读性
-
常见陷阱:幂运算右结合、负号与幂运算、逻辑运算优先级
掌握运算符优先级是编写正确表达式的关键,但在实际编程中,多用括号、保持简洁是更好的实践。
练习题
练习1
不运行代码,计算以下表达式的结果:
代码示例
print(3 + 4 * 2 ** 3 - 1)
print(2 ** 2 ** 3)
print(-2 ** 4)
print(10 > 5 and 3 < 1 or 2 == 2)
print(not False or True and not True)练习2
以下表达式有歧义或容易出错,请使用括号使其意图更清晰:
代码示例
a = x + y * z
b = a & b + c
c = not x or y and z
d = a > b == c
e = x | y << 2常见问题
Python中幂运算符**的结合性是什么?
幂运算符**是右结合的,这意味着2 ** 3 ** 2等价于2 ** (3 ** 2) = 2 ** 9 = 512,而不是(2 ** 3) ** 2 = 8 ** 2 = 64。
为什么-3 ** 2的结果是-9而不是9?
因为幂运算符**的优先级高于负号,所以-3 ** 2等价于-(3 ** 2) = -9。如果要得到9,需要写成(-3) ** 2。
逻辑运算符and、or、not的优先级顺序是怎样的?
逻辑运算符的优先级从高到低依次为:not > and > or。因此not True or True等价于(not True) or True = True。
Python中哪个运算符的优先级最低?
赋值运算符(=、+=、-=等)的优先级最低,仅次于海象运算符:=。这意味着在表达式x = 2 + 3 * 4中,会先计算右边的2 + 3 * 4 = 14,然后再赋值给x。
为什么建议在复杂表达式中多用括号?
虽然理解优先级规则很重要,但在复杂表达式中使用括号可以:1)明确运算顺序,避免歧义;2)提高代码可读性,让其他开发者更容易理解你的意图;3)减少因优先级混淆导致的bug。即使括号不是必需的,加上括号也不会影响性能。
本文涉及AI创作
内容由AI创作,请仔细甄别