python运算符优先级

本文详细介绍了Python中运算符的优先级规则,包括幂运算高于乘除运算,乘除运算高于加减运算,加减运算高于比较运算,以及逻辑运算和赋值运算的优先级。通过示例代码展示了如何利用括号改变运算顺序,并强调了同级运算符的处理方式。
摘要由CSDN通过智能技术生成

        通过本专栏《小白轻松学python》前面一些文章的介绍,我们知道了python中一些常用的运算符。当这些常用的运算符同时出现在同一个表达式中时,它们是有运算的优先顺序的。就像数学中的四则运算一样,乘除法会优先于加减法,有括号的先算括号中的内容。

python常用运算符优先级表

**幂运算
*、/、%、//乘、除、取余、取整
+、-加、减
<、>、<=、>=、==、!=、is、is not、in、not in比较运算符、身份运算符、成员运算符
not逻辑运算符 not
and逻辑运算符 and
or逻辑运算符 or
=、+=、-=、*=、/=、%=、//=、**=赋值运算符

        以上常用的运算符优先级从上到下依次降低,运算优先级高的先计算,低的后计算。有括号时会优先运算括号中的内容,所以我们可以利用括号来打破运算优先级的限制。

优先级顺序

幂运算高于乘除运算

        幂运算的运算优先级高于乘除运算,当幂运算与乘除运算在同一个表达式中时,会先计算幂运算再计算乘除运算。

number = 3 * 2 ** 2
print(number)  # 12

通过上面的代码,我们可以发现是先运算 2 ** 2 = 4 再运算 3 * 4 = 12,如果是先运算 3 * 2 = 6 再运算 6 ** 2 = 36。结果明显是12而不是36,所以幂运算高于乘法运算。

number = 8 / 2 ** 2
print(number)  # 2.0

通过上面的代码,我们可以发现是先运算 2 ** 2 = 4 再运算 8 / 4 = 2.0,如果是先运算 8 / 2 = 4.0 再运算 4.0 ** 2 = 16.0。结果明显是2.0而不是16.0,所以幂运算高于除法运算。

number = 7 % 2 ** 2
print(number)  # 3

通过上面的代码,我们可以发现是先运算 2 ** 2 = 4 再运算 7 % 4 = 3,如果是先运算 7 % 2 = 1 再运算 1 ** 2 = 1。结果明显是3而不是1,所以幂运算高于取余运算。

number = 7 // 2 ** 2
print(number)  # 1

通过上面的代码,我们可以发现是先运算 2 ** 2 = 4 再运算 7 // 4 = 1,如果是先运算 7 // 2 = 3 再运算 3 ** 2 = 9。结果明显是1而不是9,所以幂运算高于取整运算。

乘除运算高于加减运算

        乘除运算的优先级高于加减运算,当乘除法与加减法在同一个表达式中时,会先计算乘除法再计算加减法。

number = 5 + 2 * 2
print(number)  # 9

通过上面的代码,我们可以发现是先运算 2 * 2 = 4 再运算 5 + 4 = 9,如果是先运算 5 + 2 = 7 再运算 7 * 2 = 14。结果明显是9而不是14,所以乘法运算高于加法运算。

number = 5 - 2 / 2
print(number)  # 4.0

通过上面的代码,我们可以发现是先运算 2 / 2 = 1.0 再运算 5 - 1.0 = 4.0,如果是先运算 5 - 2 = 3 再运算 3 / 2 = 1.5。结果明显是4.0而不是1.5,所以除法运算高于减法运算。

number = 5 - 2 % 2
print(number)  # 5

通过上面的代码,我们可以发现是先运算 2 % 2 = 0 再运算 5 - 0 = 5,如果是先运算 5 - 2 = 3 再运算 3 % 2 = 1。结果明显是5而不是1,所以取余运算高于减法运算。

number = 5 + 2 // 2
print(number)  # 6

通过上面的代码,我们可以发现是先运算 2 // 2 = 1 再运算 5 + 1 = 6,如果是先运算 5 + 2 = 7 再运算 7 // 2 = 3。结果明显是6而不是3,所以取整运算高于加法运算。

加减运算高于比较运算

        这里要补充一个知识点:bool值True和False可以作为整数1和0参与到数字的运算中。

        加减运算优先级高于比较运算,当加减运算与比较运算在同一个表达式中时,会先计算加减运算再计算比较运算。

number = 0

if 5 < 3 + 2:
    number = 1
else:
    number = 2

print(number)  # 2

通过上面的代码,我们可以发现是先运算 3 + 2 = 5 再运算 5 < 5 = False,条件为假执行else下面的代码 number = 2 ;如果是先运算 5 < 3 = False 再运算 False + 2 = 2 ,条件为真执行if下面的代码 number = 1 。结果明显是2,所以加法运算高于小于比较运算。

number = 0

if 1 > 3 - 2:
    number = 1
else:
    number = 2

print(number)  # 2

通过上面的代码,我们可以发现是先运算 3 - 2 = 1 再运算 1 > 1 = False,条件为假执行else下面的代码 number = 2 ;如果是先运算 1 > 3 = False 再运算 False - 3 = -3 ,条件为真执行if下面的代码 number = 1 。结果明显是2,所以减法运算高于大于比较运算。

number = 0

if 5 <= 3 + 1:
    number = 1
else:
    number = 2

print(number)  # 2

通过上面的代码,我们可以发现是先运算 3 + 1 = 4 再运算 5 <= 4 = False,条件为假执行else下面的代码 number = 2 ;如果是先运算 5 <= 3 = False 再运算 False + 1 = 1 ,条件为真执行if下面的代码 number = 1 。结果明显是2,所以加法运算高于小于等于比较运算。

number = 0

if 5 >= 3 - 1:
    number = 1
else:
    number = 2

print(number)  # 1

通过上面的代码,我们可以发现是先运算 3 - 1 = 2 再运算 5 >= 2 = True,条件为真执行if下面的代码 number = 1 ;如果是先运算 5 >= 3 = True 再运算 True - 1 = 0 ,条件为假执行else下面的代码 number = 2 。结果明显是1,所以减法运算高于大于等于比较运算。

number = 0

if 5 == 3 + 3:
    number = 1
else:
    number = 2

print(number)  # 2

通过上面的代码,我们可以发现是先运算 3 + 3 = 6 再运算 5 == 6 = False,条件为假执行else下面的代码 number = 2 ;如果是先运算 5 == 3 = False 再运算 False + 3 = 3 ,条件为真执行if下面的代码 number = 1 。结果明显是2,所以加法运算高于等于比较运算。

number = 0

if 5 != 3 - 1:
    number = 1
else:
    number = 2

print(number)  # 1

通过上面的代码,我们可以发现是先运算 3 - 1 = 2 再运算 5 != 2 = True,条件为真执行if下面的代码 number = 1 ;如果是先运算 5 != 3 = True 再运算 True - 1 = 0 ,条件为假执行else下面的代码 number = 2 。结果明显是1,所以减法运算高于不等于比较运算。

加减运算高于身份运算

        加减运算优先级高于身份运算,当加减运算与身份运算在同一个表达式中时,会先计算加减运算再计算身份运算。

state = 1 + 1 is 2
print(state)  # True

通过上面的代码,我们可以发现是先运算 1 + 1 = 2 再运算 2 is 2 = True;如果是先运算 1 is 2 = False 再运算 1 + False = 1,那么state的值为1。结果明显是True而不是1,所以加法运算高于身份运算。

state = 1 - 1 is not 2
print(state)  # True

通过上面的代码,我们可以发现是先运算 1 - 1 = 0 再运算 0 is not 2 = True;如果是先运算 1 is not 2 = True 再运算 1 - True = 0,那么state的值为0。结果明显是True而不是0,所以减法运算高于身份运算。

加减运算高于成员运算

        加减运算优先级高于成员运算,当加减运算与成员运算在同一个表达式中时,会先计算加减运算再计算成员运算。

state = 1 + 1 in [0, 1, 2]
print(state)  # True

通过上面的代码,我们可以发现是先运算 1 + 1 = 2 再运算 2 in [0, 1, 2] = True;如果是先运算 1 in [0, 1, 2] = True 再运算 1 + True = 2,那么state的值为2。结果明显是True而不是2,所以加法运算高于成员运算。

state = 1 - 1 not in [0, 1, 2]
print(state)  # False

通过上面的代码,我们可以发现是先运算 1 - 1 = 0 再运算 0 not in [0, 1, 2] = False;如果是先运算 1 not in [0, 1, 2] = False 再运算 1 - False = 1,那么state的值为1。结果明显是False而不是1,所以减法运算高于成员运算。

比较运算高于not

        比较运算的优先级高于逻辑运算not,当比较运算与not运算在同一个表达式中时,会先计算比较运算再计算not运算。

state = not 6 <= 6
print(state)  # False

通过上面的代码,我们可以发现是先运算 6 <= 6 = True 再运算 not True = False;如果是先运算  not 6 = False 再运算 False <= 6 = True。结果明显是False而不是True,所以比较运算高于not运算。

身份运算高于not

        身份运算的优先级高于逻辑运算not,当身份运算与not运算在同一个表达式中时,会先计算身份运算再计算not运算。

state = not 7 is not 6
print(state)  # False

通过上面的代码,我们可以发现是先运算 7 is not 6 = True 再运算 not True = False;如果是先运算 not 7 = False 再运算 False is not 6 = True。结果明显是False而不是True,所以身份运算高于not运算。

成员运算高于not

        成员运算的优先级高于逻辑运算not,当成员运算与not运算在同一个表达式中时,会先计算成员运算再计算not运算。

state = not 7 in [False, 6, 7, 8]
print(state)  # True

通过上面的代码,我们可以发现是先运算 7 in [False, 6, 7, 8] = True 再运算 not True = False;如果是先运算 not 7 = False 再运算 False in [False, 6, 7, 8] = True。结果明显是False而不是True,所以成员运算高于not运算。

not高于and

        逻辑运算not优先级高于逻辑运算and, 当not与and在同一个表达式中时,会先计算not再计算and。

state = True and not False
print(state)  # True

通过上面的代码,我们可以发现是先运算 not False = True 再运算 True and True = True;如果是先运算 True and not 会报错SyntaxError: invalid syntax。结果明显是True,所以逻辑运算not高于and。

and高于or

        逻辑运算and优先级高于逻辑运算or, 当and与or在同一个表达式中时,会先计算and再计算or。

state = True or True and False
print(state)  # True

通过上面的代码,我们可以发现是先运算 True and False = False 再运算 True or False = True;如果是先运算 True or True = True 再运算 True and False = False 。结果明显是True而不是False,所以逻辑运算and高于or。

or高于赋值运算

        逻辑运算or优先级高于赋值运算, 当or与赋值运算在同一个表达式中时,会先计算or再计算赋值运算。

number = 0
number += False or 5
print(number)  # 5

通过上面的代码,我们可以发现是先运算 False and 5 = 5 再运算 number += 5,此时number为5;如果是先运算 number += False 再运算 number or 5 ,此时number为0。结果明显是5而不是0,所以逻辑运算or高于赋值运算。

同级优先级

        处于同一级别的运算符,它们的优先级又是怎样的呢?

乘除运算(从左往右)

        乘除运算的同级优先顺序是从左往右看,谁靠左谁优先。

number = 9 / 3 * 3
print(number)  # 9.0

通过上面的代码,我们可以发现是先运算 9 / 3 = 3.0 再运算 3.0 * 3 = 9.0;如果是先运算 3 * 3 = 9 再运算 9 / 9 = 1.0 。结果明显是9.0而不是1.0,所以乘除运算的同级优先顺序是从左往右看,谁靠左谁优先。

加减运算(从左往右)

        加减运算的同级优先顺序是从左往右看,谁靠左谁优先。

number = 2 + 5 - 3
print(number)  # 4

通过上面的代码,我们可以发现是先运算​​​​​​​ 2 + 5 = 7 再运算 7 - 3 = 4;如果是先运算 5 - 3 = 2 再运算 2 + 2 = 4 。从结果来看都一样,其实加减法就是这个德行不管先算谁都一样。但是加减运算同级优先的底层逻辑还是从左往右看,谁靠左谁优先。

比较、身份、成员(真·同级)

        比较、身份、成员运算是真正的同级运算,当它们处于同一表达式中时,从逻辑中看不出优先顺序。感觉底层逻辑使用了一个and运算来把它们分开计算,都算出结果后在进行and运算。

state = 3 < 5 is 5  # 类似于 3 < 5 and 5 is 5
print(state)  # True

通过上面的代码,我们可以发现​​​​​​​ 3 < 5 is 5 被分成了两部分 3 < 5 = True  5 is 5 = True,再计算True and True =True;如果是先运算 3 < 5 = True 再运算 True is 5 = False ;如果是先运算 5 is 5 = True 再运算 3 < True = False 。结果明显是True而不是False,所以比较、身份、成员是真正的同级运算。

赋值运算(=)

       当有多个=号在一个表达式中时,是从右往左看,谁靠右谁优先。

number1 = number2 = 1
print(number1)  # 1

先给number2赋值为1,再把number2的值赋值给number1,所以number1的值为1。

        因为赋值运算没有返回值,所以其他的赋值运算不支持同级运算。

括号改变优先级顺序

        使用括号可以改变运算符的优先级,括号内的运算符就算比括号外的运算符优先级低,也会先计算括号内的运算。

number = (2 * (1 + (3 < 5))) ** 2
print(number)  # 16

通过上面的代码,我们可以发现是先运算​​​​​​​ 3 < 5 = True 再运算 1 + True = 2 再运算  2 * 2 = 4 再运算  4 ** 2 = 16 

        如果你想了解更多的运算符优先级,请跳转到python官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值