逻辑运算符中比较常见的就是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
,结果为0
,0 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
,印证了我们之前的推断。
此外,对于同一种类的运算符,运算次序服从从左到右的执行顺序,想要更改运算次序添加小括号即可。
如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~