python ‘|‘(竖线)与‘or’标识符在逻辑布尔运算时的不同(运算优先级)

10 篇文章 3 订阅
9 篇文章 0 订阅

今天我遇到了这样一个问题:

source='reset'
print(source.find('%reset') != -1 | source.strip().startswith('reset'))
得到的结果:False

我希望用以上代码判断source变量中是否含有字符串'reset'或者'%reset'。但是出乎意料的是,明明以上两个表达式中的第二个是True,第一个是False,为什么最终算出来是False呢?

在一些教程中,直接写明了python中,|or在逻辑运算时意思相同。但这样的表述并不严谨,因为会忽略运算优先级的问题。

我曾经学过在C语言。在C语言中,||表示的是逻辑或,而|表示的则是按位或。在我看来,这种运算符标记,是比较方便的。

在python语言中没有||,只有|符号。当|两端可位运算时,就执行位运算。特别地,两端的变量为布尔型(TrueFalse)的时候,就是逻辑或的关系。

从C语言过渡到主攻python之后,我便顺理成章的习惯于使用|作为判断标志,类似于C语言的||那样。一年多来一直没有遇到问题,或者是遇到问题后加括号就解决了。

今天,我终于打算上网深究一下这个问题。原来,我一直将|当成C语言中的||。殊不知,运算的优先级是有不同的。在C语言中,==是优先于||,但是Python中则是|运算符优先于==

而实际上,python语言的|,和C语言中的|含义是一样的,都是按位运算的意思。在C语言中|在某些场合下也可以替换||,但也会引入优先级问题。

回到上面的问题:

source.find('%reset') != -1 | source.strip().startswith('reset')

代码中,由于!=优先级低于|,所以首先计算|两侧的值。-1|source.strip().startswith('reset'),两端的值分别为-1|0。进行按位或计算,得到-1。
接下来再计算source.find('%reset')!=-1,由于source中明显不含字符串'%reset',所以左端值为-1。由此整个式子化简为-1!=-1,最终结果为False。

这样,我们就找到了这个问题的症结所在。那么如何解决这个问题呢?

首先的方法就是加括号。


>>>print((source.find('%reset') != -1) | (source.strip().startswith('reset')))
True

其次,使用and 、 or来代替| 、 &and、or的优先级在==(同优先级还有!=、<=、<等)之后,由此,即使不加括号也能算出希望的结果。

>>>print(source.find('%reset') != -1 or source.strip().startswith('reset'))
True

最后说一句,使用or代替|还有诸多好处。假设两边的判断语句是100*100==10000999*999==10000,那么如果用or
的话,计算出第一个语句结果为True,就可以直接向下执行了;作为对比,用|(当然,要向上文那样加括号)的话,就必须算出两边的结果,按位或之后再向下执行。

于是得出结论:|是按位或,或逻辑运算有运算优先级上的不同。在逻辑判断的场合下,如果使用or,有助于简化括号层数,并且有助于加速。因此一般情况下推荐使用or。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值