Python中运算符优先级和结合性
在本教程中,我们将了解Python运算符的优先级和结合性。了解Python运算符的机制对开发者至关重要。
在查阅之后最好理解Python如何评估其运算符的顺序。有些运算符有优先级,例如,除法运算符的优先级高于乘法运算符,因此除法优先执行。
Python解释器首先执行任何给定逻辑或算术表达式中优先级较高的运算符。除了指数运算符(**)外,所有其他运算符都是从左到右执行的。
Python运算符的优先级
表达式是包含数字、变量、运算符和内置或用户定义的函数调用的集合。Python解释器可以计算一个有效的表达式。
代码
2 - 7
输出:
-5
这里以表达式2-7作为示例。在表达式中,我们可以添加多个运算符。Python中有一个关于评估这些类型表达式的优先级原则。它指导了某些任务完成的顺序。
例如,除法比加法的优先级更高。
代码
# Division has higher precedence than addition
16 + 16 / 2
输出:
24.0
然而,我们可以通过使用括号()来颠倒这个顺序,括号比除法具有优先权。
代码
# Parentheses () holds higher precedence
(16 + 16) / 2
输出:
16.0
以下表格显示了Python运算符的优先级。它按从高到低的顺序排列(上面的运算符比下面的运算符优先级更高)。
运算符 | 含义 |
---|---|
() |
括号 |
** |
乘方 |
+x, -x, ~x |
一元正号, 一元负号, 位取反 |
*, /, //, % |
乘法, 除法, 地板除法, 取模 |
+, - |
加法, 减法 |
<<, >> |
位移运算符 |
& |
位与 |
^ |
位异或 |
| |
位或 |
==, !=, >, >=, <, <=, is, is not, in, not in |
比较运算符, 身份运算符, 成员运算符 |
not |
逻辑非 |
and |
逻辑与 |
or |
逻辑或 |
考虑以下示例:
假设我们正在构建一个if…else块,只有在颜色为红色或绿色且数量大于等于5时才执行。
代码
# Precedence of and and or operators
colour = "red"
quantity = 0
if colour == "red" or colour == "green" and quantity >= 5:
print("Your parcel is dispatched")
else:
print("your parcel cannot be dispatched")
输出:
Your parcel is dispatched
即使数量为0,该程序也会运行if块。因为and的优先级高于or且不会产生预期的结果。
适当使用括号(),我们可以得到所需的结果:
代码
# Precedence of and and or operators
colour = "red"
quantity = 0
if (colour == "red" or colour == "green") and quantity >= 5:
print("Your parcel is dispatched")
else:
print("Your parcel cannot be dispatched")
输出:
Your parcel cannot be dispatched
Python运算符的结合性
我们可以观察到一个给定的类别包含了上面列表中的许多运算符。这些运算符的顺序是相同的。
结合性有助于确定当两个具有相同优先级的运算符共享时的操作顺序。
对于任何具有相同优先级的多个运算符的表达式来说,其用于评估的方向就是结合性。几乎所有的运算符都是从左到右结合的。
代码
# This shows Left to right associativity
print(4 * 9 // 3)
# Using parenthesis this time to show left to right associativity
print(4 * (9 // 3))
输出:
12
12
注意:在Python中,指数运算符**具有从右到左的结合性。
代码
# This example demonstrates the right to left associativity of exponent operator **
print (3 ** 2 ** 3)
# If we want to first solve 5 ** 7 then we can use ()
print ((3 ** 2) ** 3)
输出:
6561
729
非关联运算符
一些运算符,比如比较或赋值运算符,在Python中没有关联性规则。这种类型的运算符有自己无法表示为关联性的规则。例如,a < b < c与(a < b) < c或a < (b < c)是不同的。a < b < c从左到右进行评估,类似于a < b和b < c。
另外,虽然链接赋值运算符如a = b = c = 3是完全可接受的,但a = b = c += 2是不可接受的。
代码
# Defining the variables a, b, and, c
a = b = c = 3
#If the operator += follows associativity answer will shown otherwise error will be raised
a = b = c += 2
输出:
a = b = c += 2
^
SyntaxError: invalid syntax
因此,该运算符不遵循从左到右的结合性。
下表显示了各种Python运算符的结合性。
运算符 | 描述 | 结合性 |
---|---|---|
( ) |
括号 | 从左到右 |
** |
指数 | 从右到左 |
* / % |
乘法 / 除法 / 求模 | 从左到右 |
+ - |
加法 / 减法 | 从左到右 |
<< >> |
按位左移 / 按位右移 | 从左到右 |
< <= > >= |
关系运算符:小于 / 小于等于 / 大于 / 大于等于 | 从左到右 |
== != |
关系运算符:等于 / 不等于 | 从左到右 |
is, is not in, not in |
身份运算符 成员运算符 | 从左到右 |
& |
按位与运算符 | 从左到右 |
^ |
按位异或运算符 | 从左到右 |
| |
按位或运算符 | 从左到右 |
not |
逻辑非 | 从右到左 |
and |
逻辑与 | 从左到右 |
or |
逻辑或 | 从左到右 |
= += -= *= /= %= &= ^= |= <<= >>= |
赋值运算符: 加法 / 减法 乘法 / 除法 求模 / 按位与 按位异或 / 按位或 按位左移 / 右移 | 从右到左 |
在Python中,我们如何保留运算符的优先级
你有没有了解过算术中的BODMAS规则?
肯定有过!
括号、次方、乘法、除法、加法和减法都是BODMAS的首字母缩写。当一个方程中有多个算术运算时,该规则指定它们应该计算的顺序。
如果我们观察上面给出的优先级表,我们会注意到操作符的顺序如下:
括号-次方-乘法-除法-加法-减法
这个规则的首字母缩写是PEMDAS,与BODMAS相对应。
结论
在本教程中,我们学到了:
优先级规则确定了在一个方程中实施各种运算符的优先级。
同一级别的多个操作或具有相同优先级的操作符在方程中的使用方式是由结合性规则确定的。