pin_drop当前位置:知识文库 ❯ 图文

Python运算符优先级

概述

当一个表达式中包含多种运算符时,Python会按照预定义的优先级规则决定运算的执行顺序。理解运算符优先级是编写正确表达式的基础,可以避免因运算顺序不当导致的逻辑错误。本节将详细介绍Python运算符的优先级规则、优先级表格以及使用括号改变优先级的方法。


优先级规则

Python运算符优先级遵循以下基本原则:

  • 优先级高的先运算:优先级高的运算符先执行,优先级低的后执行

  • 相同优先级从左到右:大多数运算符从左到右依次运算(左结合)

  • 幂运算从右到左**运算符是右结合的

  • 括号最优先:括号内的表达式最先运算

基本优先级顺序(从高到低)

括号 → 幂运算 → 正负号 → 乘除取模整除 → 加减 → 位移 → 按位与 → 按位异或 → 按位或 → 比较运算 → 成员运算 → 身份运算 → 逻辑非 → 逻辑与 → 逻辑或 → 条件表达式 → 赋值 → 海象运算符


优先级表格

优先级 运算符 描述 结合性
1(最高) () 括号
2 ** 幂运算 右结合
3 +x, -x, ~x 正号、负号、按位取反 右结合
4 *, /, //, % 乘、除、整除、取模 左结合
5 +, - 加、减 左结合
6 <<, >> 左移、右移 左结合
7 & 按位与 左结合
8 ^ 按位异或 左结合
9 | 按位或 左结合
10 ==, !=, >, <, >=, <= 比较运算符 左结合
11 is, is not 身份运算符 左结合
12 in, not in 成员运算符 左结合
13 not 逻辑非 右结合
14 and 逻辑与 左结合
15 or 逻辑或 左结合
16 if-else 条件表达式 右结合
17 =, +=, -=, 等 赋值运算符 右结合
18(最低) := 海象运算符 左结合

记忆口诀

为了方便记忆,可以按照以下简化顺序:

记忆口诀括号正负号乘除加减位移位运算(与→异或→或) → 比较身份成员逻辑(非→与→或) → 赋值


括号改变优先级

括号是改变运算顺序的最直接方式,括号内的表达式总是最先运算。

基本用法

代码示例

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 < 101 < 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。即使括号不是必需的,加上括号也不会影响性能。

标签: 运算符优先级 Python基础 运算符 表达式 括号 逻辑运算 幂运算

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python身份运算符is和is not 下一篇: Python整数类型int

poll相关推荐

作者头像 智能小晨 python

Python类型转换详解

发布日期 2026-05-27
全面掌握Python类型转换的核心知识,包括int float str bool等内置函数的用法、隐式转换规则、容器类型之间的转换方法,以及使用try-except安全处理转换异常的实战技巧。通过丰富的代码示例,帮助你写出更健壮的Python代码。
作者头像 智能小晨 python

Python字符串类型详解

发布日期 2026-05-27
全面学习Python字符串类型的核心知识,涵盖单引号双引号三引号定义方式、原始字符串r前缀、转义字符详解、字符串不可变性原理以及Unicode编码支持。
作者头像 智能小晨 python

Python布尔类型详解

发布日期 2026-05-27
深入解析Python布尔类型的核心知识,包括True和False的定义、and or not逻辑运算、短路求值特性、bool()函数用法以及隐式布尔转换规则。通过丰富的代码示例,帮助你掌握Python布尔类型的实际应用,写出更优雅的条件判断代码。
作者头像 智能小晨 python

Python复数类型complex详解

发布日期 2026-05-27
全面介绍Python复数类型complex的使用方法,包括复数定义、实部虚部访问、算术运算、cmath模块函数以及极坐标转换。掌握复数在科学计算和工程领域的应用。