博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python or and 优先级,短路原则

Posted on 2018-07-04 13:09  bw_0927  阅读(467)  评论(0)    收藏  举报

https://www.zhihu.com/question/20152384

 

>>> print '' or 5 or 0
5
>>> print 5 and 4
4
>>> print '' or 5 or 0 and 4
5

 

对python而言

其一, 在不加括号时候, and优先级大于or

其二, x or y 的值只可能是x或y. x为真就是x, x为假就是y 【】

第三, x and y 的值只可能是x或y. x为真就是y, x为假就是x【x为真,表达式的真假还需要看后面的y,表达式的值是y; x为假,表达的值肯定也为假,无需再看后面的y,表达式的值就为x】

显然,

对于, 1 or 5 and 4: 先算5 and 4, 5为真, 值为4. 再算1 or 4, 1 为真,值为1

对于, (1 or 5) and 4: 先算1 or 5, 1为真, 值为1. 再算1 and 4, 1为真,值为4


=====================

 

=====================

这个规则符合"短路"原则:
  • or的左边表达式只要返回了真值,即会终止对右边表达式取值,直接返回左边表达式的值。
 
  • and则是左右两边表达式均返回真值时才会返回右边比表达式的值作为and表达式整体的值; 如果有一边为假值则只会返回假值。
 
  • 然后联合起来的情况是从左到右生成一颗2叉树,对整个表达式的求值过程就是按照上面的规则先序遍历整棵数的过程。
比如0 or 5 and 7 or 0 生成的树就是
or
0 and
5 or
7 0
求值过程是 先取到 or,取左值 0,木有短路,取右值,and表达式,再取左值 5,为真,再取右值 or表达式,取左值,7,为真,短路之,后面不管了,返回7,and表达式左右都是真,返回右值,or 表达式最后返回右值,就是七
>>> print 0 or 5 and 7 or 0
7