Python布尔表达式和或
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python布尔表达式和或相关的知识,希望对你有一定的参考价值。
在python中,如果你写的东西像
foo==bar and spam or eggs
如果布尔语句为true,则python似乎返回垃圾邮件,否则返回egg。有人可以解释这种行为吗?为什么表达式没有被评估为像一个长布尔值?
编辑:具体来说,我试图弄清楚为什么'垃圾'或'鸡蛋'作为表达结果返回的机制。
运算符and
和or
是短路的,这意味着如果表达式的结果可以从仅评估第一个操作数推断出,则不计算第二个操作数。例如,如果表达式a or b
和a
的计算结果为true,那么b
是什么并不重要,表达式的结果为true,因此不评估b
。它们的实际工作如下:
a and b
:如果a为假,则不评估b并返回a,否则返回b。a or b
:如果a是真实的,则不评估b并返回a,否则返回b。
Falsey和truthy引用在布尔上下文中求值为false或true的值。
然而,在没有更好的替代方案的时代,这个和/或成语很有用,但现在有更好的方法:
spam if foo==bar else eggs
和/或成语的问题(除了它让初学者感到困惑)是,如果条件为真,它会给出错误的结果,但垃圾邮件评估为假值(例如空字符串)。因此你应该避免它。
这就是Python布尔运算符的工作方式。
来自the documentation(最后一段解释了为什么操作员按照他们的方式工作的好主意):
在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:
False
,None
,所有类型的数字零,以及空字符串和容器(包括字符串,元组,列表,字典) ,集和frozensets)。所有其他值都被解释为true。 (有关改变这种情况的方法,请参阅__nonzero__()
特殊方法。)运算符
not
如果其参数为假则产生True
,否则为False
。表达式
x and y
首先评估x
;如果x
为假,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y并返回结果值。(请注意,
and
和or
都不会限制它们返回False
和True
的值和类型,而是返回最后一个被评估的参数。这有时很有用,例如,如果s
是一个字符串,如果它是一个应该被默认值替换的字符串空,表达式s or 'foo'
产生所需的值。因为not
无论如何都必须发明一个值,所以它并不打算返回与其参数相同类型的值,因此,例如,not 'foo'
产生False
,而不是''
。)
原因是Python使用所涉及变量的实际值来评估布尔表达式,而不是将它们限制为True
和False
值。以下值被视为false:
None
False
- 任何数字类型的0
- 空序列或集合(
''
,()
,[]
,{}
) - 用户定义的类型,使用
__nonzero__()
或__len__()
方法返回0或False
有关更多信息,请参阅Python文档的Truth Value Testing部分。特别是:
除非另有说明,具有布尔结果的操作和内置函数总是返回
0
或False
表示false,1
或True
表示true。 (重要的例外:布尔运算or
和and
总是返回其中一个操作数。)
尝试使用括号使表达式不明确。它的方式,你得到:
(foo == bar and spam) or eggs
以上是关于Python布尔表达式和或的主要内容,如果未能解决你的问题,请参考以下文章