Python条件语句混用多次or与单次and的执行规则及输出疑问
Python 多逻辑运算符的执行优先级规则
核心结论直接放在最前面:Python 里逻辑运算符的优先级排序为 not > and > or,优先级高低和书写顺序无关。也就是说同一段条件判断里,有and的地方会先算完and的所有逻辑,再算or的部分,不会顺着你写的句子从左到右挨个算。
你那段示例代码的运算逻辑
你写的条件:x<5 or x>2 and x==5,实际在Python里执行的时候,会因为and优先级更高,自动把and连接的两个判断绑成一组,等价于加了括号的版本:x<5 or (x>2 and x==5)
很多人第一反应会把逻辑理解成从左到右算,也就是先算完左边的x<5 or x>2,再拿结果和最右边的x==5做and,也就是等价于(x<5 or x>2) and x==5——这也是为什么你会觉得最后输出no output的原因,这个认知里的顺序和Python真实的执行顺序完全不一样。
代入x=3算两种顺序的结果
- 按Python真实优先级算:
先算括号里的and部分:3>2是True,3==5是False,True和False做and结果是False;再算or部分:3<5是True,True不管和哪个值做or都是True,所以整个表达式应该返回真,打印ok。
这里还要提一嘴短路逻辑:因为or前面的3<5已经是True了,后面那串and的判断Python根本不会跑,直接就返回True了。 - 按直觉的从左到右无优先级算:
先算3<5 or 3>2,两边都是真,结果是True;再拿这个True和最右边的3==5(假)做and,最终结果是False,自然就走else分支打no output了。
你实际运行得到no output的话,无非两个原因: - 自己推导结果的时候是按从左到右的顺序算的,没有考虑and的高优先级
- 写代码的时候不小心给前两个判断加了括号,把整个表达式变成了带括号的
(x<5 or x>2) and x==5,这种情况下Python当然会输出no output
内容的提问来源于stack exchange,提问作者Mrinalini Sharma
相关产品推荐
相关产品推荐

