0
点赞
收藏
分享

微信扫一扫

python逻辑运算符not, and,or,>, <, ==的优先级


逻辑运算符中比较常见的就是​​not​​​,​​and​​​, ​​or​​​, ​​>​​​, ​​<​​​,以及​​==​​​,理论上来说​​比较运算符的优先级>not>and>or​​​。
为了说清楚它们之间的关系,我们需要先明确​​​and​​​和​​or​​运行时候的特点,代码如下:

class Debug:
def mainProgram(self):
self.x0 = 0
self.x1 = 1
self.x2 = 5
print(self.x0 and self.x1) # 0
print(self.x1 and self.x0) # 0
print(self.x1 and self.x2) # 5
print(self.x2 and self.x1) # 1
print(self.x0 or self.x1) # 1
print(self.x1 or self.x0) # 1
print(self.x1 or self.x2) # 1
print(self.x2 or self.x1) # 5
print(self.x1 > self.x0) # True
print(self.x1 < self.x0) # False
print(self.x1 == self.x0) # False


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们知道在编程语言中存在一个惯例数字0默认为False,其他不为0的数字默认为True。 从上述代码中我们可以看到,变量​​self.x0​​​的值为​​0​​​,​​self.x1​​​的值为​​1​​​,​​self.x2​​​的值为​​5​​​。​​self.x0 and self.x1​​​的值为​​0​​​,​​self.x1 and self.x0​​​的值为0,我们看到​​and​​​的结果​​True and False​​​总是为​​False​​​,而​​0​​​在意义上等同于​​False​​​(注意代码中并不等同),因此无论调换​​self.x1 and self.x0​​​的先后顺序与否,结果均为​​0​​​就不稀奇了。然而我们发现当我们调换​​self.x1​​​与​​self.x2​​​的先后顺序时,会输出处在第二个位置上的值,这个也很好理解,因为非零整数意义上等同于​​True​​​,​​True and True​​​的结果为​​True​​​,所以代码需要对​​and​​​前后的两个条件都进新判断,最后输出第二个位置的结果。接着我们看到无论调换顺序与否,​​self.x0 or self.x1​​​的值均为​​1​​​。这个也很好理解,​​True or False​​​的结果​​True​​​,所以应当保留​​True​​​的结果,最终结果为​​1​​​。再接下来我们看到当我们调换先后位置后,​​self.x1 or self.x2​​​的输出结果为​​1​​​,​​self.x2 or self.x1​​​的输出结果为​​5​​,python默认输出的是第一个位置上的结果。由此我们得到以下结论,在python中,and逻辑运算符,当and前后的条件均为真时,输出后一个条件的结果,当前后的条件为一真一假时输出条件为假的结果。or逻辑运算符当or前后的条件均为真时,输出前一个条件的结果,当前后的条件为一真一假时,输出条件为真的结果。而比较运算符的结果通常为True或者False。
接下来我们会使用上面的结论来探索​​​and​​​, ​​or​​​, ​​>​​​, ​​<​​​,以及​​==​​​逻辑运算的优先级。首先我们将他们分为三类,​​not​​​为一类,​​and​​​为一类,​​or​​​为一类,比较运算符 ​​>​​​, ​​<​​​,以及​​==​​为一类,代码如下:

class Debug:
def mainProgram(self):
self.x0 = 0
self.x1 = 1
self.x2 = 5
print(self.x1 > self.x0 and self.x2) # 5
print(self.x1 < self.x0 and self.x2) # False


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们可以看到​​self.x1 > self.x0 and self.x2​​​输出的结果为​​5​​​而​​self.x1 < self.x0 and self.x2​​​的结果为​​False​​​。对于​​self.x1 > self.x0 and self.x2​​​来说,如果比较运算符的优先级较高,先执行​​self.x1 > self.x0​​​条件判断,结果应该为​​True​​​,再执行​​True and 5​​​(变量​​self.x2​​​的值为​​5​​​)的结果根据我们之前总觉得规律应该为​​5​​​。对于​​self.x1 < self.x0 and self.x2​​​来说,​​self.x1 < self.x0​​​的结果为​​False​​​,而​​False and 5​​​的结果根据之前的规律应该为​​False​​​。那么如果比较运算符的优先级低于​​and​​​呢?对​​self.x1 > self.x0 and self.x2​​​而言,​​self.x0 and self.x2​​​的结果为​​0​​​,​​1 > 0​​​的结果为​​True​​​,所以最终的结果应该为​​True​​,很明显与我们得到的结果不符。由此我们可以得到比较运算符的优先级高于and。
联想一下我们在写代码的时候经常使用的条件语句,if x > 30 and x < 100:,通常我们并不会给​and​两侧的比较运算符条件部分添加括号,这也是因为比较运算符的优先级高与​and​的原因。
接下来我们比较​​​not​​​运算符与​​or​​运算符的优先级。代码如下:

class Debug:
def mainProgram(self):
self.x1 = 1
print(not self.x1 or self.x1) # 1


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们看到最终的输出结果为​​1​​​,假设​​or​​​的运算符优先级较高,​​self.x1 or self.x1​​​的结果应为​​1​​​,​​not 1​​​的结果应该为​​0​​​。与输出结果不符合,我们再假设​​not​​​的优先级较高,​​not self.x1​​​为​​not 1​​​,结果为​​False​​​,​​False or 1​​​的结果为​​1​​,与我们得到的结果一致,因此推断,not运算符的优先级高于or算符的优先级。
接下来我们再比较​​​and​​​算符的优先级与​​or​​算符的优先级。代码如下:

class Debug:
def mainProgram(self):
self.x0 = 0
self.x1 = 1
self.x2 = 2
print( self.x0 and self.x1 or self.x2) # 2
print( self.x1 and self.x0 or self.x2) # 2


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们假设​​or​​​的优先级较高,对​​self.x0 and self.x1 or self.x2​​​来说,根据前面总结的规律​​self.x1 or self.x2​​​的结果应该为​​1​​​,​​self.x0 and 1​​​的结果为​​0​​​与我们的结果为​​2​​​不符合。因此进一步考虑​​or​​​算符的优先级低于​​and​​​。​​self.x0 and self.x1​​​的结果为​​0​​​,​​0 or self.x2​​​的结果为​​2​​​。进一步可以针对​​self.x1 and self.x0 or self.x2​​进行验证,这里省略讨论过程。最终我们得到结论,and算符的优先级大于or算符的优先级。
同理使用如下代码可以比较​​​not​​​算符与​​and​​算符的优先级。

class Debug:
def mainProgram(self):
self.x0 = 0
self.x1 = 1
print(not 0) # True
print(not 1) # False
print(not self.x0 and self.x1) # 1


if __name__ == "__main__":
main = Debug()
main.mainProgram()

很轻易地我们可以看出,如果​​and​​​优先级较高,那么最终的输出结果应该为​​True​​​或者​​False​​​,而现在的输出结果是一个数字,因此​​not​​​的优先级高于​​and​​​。
最终我们需要确认比较运算符和​​​not​​运算符的优先级关系,并以此来确定出这四个种类运算的优先级顺序,代码如下:

class Debug:
def mainProgram(self):
self.x0 = 0
self.x1 = 1
print(not 0) # True
print(True > 1) # False
print(not self.x0 > self.x1) # True


if __name__ == "__main__":
main = Debug()
main.mainProgram()

我们可以看到,当我们测试​​True > 1​​​时,输出的结果为​​False​​,因此我们可以推断,比较运算符的优先级大于not算符。 因为如果​​not​​​算符的优先级较高,​​not self.x0​​​的结果为​​True​​​,而​​True > 1​​​的结果为​​False​​​,与我们最终得到的​​True​​​的结果不符合,如果比较运算符的优先级较高,那么​​self.x0 > self.x1​​​的结果为​​False​​​,​​not False​​​的结果为​​True​​​,印证了我们之前的推断。
此外,对于同一种类的运算符,运算次序服从从左到右的执行顺序,想要更改运算次序添加小括号即可。


举报

相关推荐

0 条评论