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

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

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的值为0self.x1的值为1self.x2的值为5self.x0 and self.x1的值为0self.x1 and self.x0的值为0,我们看到and的结果True and False总是为False,而0在意义上等同于False(注意代码中并不等同),因此无论调换self.x1 and self.x0的先后顺序与否,结果均为0就不稀奇了。然而我们发现当我们调换self.x1self.x2的先后顺序时,会输出处在第二个位置上的值,这个也很好理解,因为非零整数意义上等同于True,True and True的结果为True,所以代码需要对and前后的两个条件都进新判断,最后输出第二个位置的结果。接着我们看到无论调换顺序与否,self.x0 or self.x1的值均为1。这个也很好理解,True or False的结果True,所以应当保留True的结果,最终结果为1。再接下来我们看到当我们调换先后位置后,self.x1 or self.x2的输出结果为1self.x2 or self.x1的输出结果为5,python默认输出的是第一个位置上的结果。由此我们得到以下结论,在python中,and逻辑运算符,当and前后的条件均为真时,输出后一个条件的结果,当前后的条件为一真一假时输出条件为假的结果。or逻辑运算符当or前后的条件均为真时,输出前一个条件的结果,当前后的条件为一真一假时,输出条件为真的结果。而比较运算符的结果通常为True或者False。
接下来我们会使用上面的结论来探索andor><,以及==逻辑运算的优先级。首先我们将他们分为三类,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输出的结果为5self.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的结果为01 > 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的结果应为1not 1的结果应该为0。与输出结果不符合,我们再假设not的优先级较高,not self.x1not 1,结果为00 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的结果应该为1self.x0 and 1的结果为0与我们的结果为2不符合。因此进一步考虑or算符的优先级低于andself.x0 and self.x1的结果为00 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的结果为Falsenot False的结果为True,印证了我们之前的推断。
此外,对于同一种类的运算符,运算次序服从从左到右的执行顺序,想要更改运算次序添加小括号即可。
如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~

猜你喜欢

转载自blog.csdn.net/u011699626/article/details/108591857