Python布尔表达式和或

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python布尔表达式和或相关的知识,希望对你有一定的参考价值。

在python中,如果你写的东西像

foo==bar and spam or eggs

如果布尔语句为true,则python似乎返回垃圾邮件,否则返回egg。有人可以解释这种行为吗?为什么表达式没有被评估为像一个长布尔值?

编辑:具体来说,我试图弄清楚为什么'垃圾'或'鸡蛋'作为表达结果返回的机制。

答案

运算符andor是短路的,这意味着如果表达式的结果可以从仅评估第一个操作数推断出,则不计算第二个操作数。例如,如果表达式a or ba的计算结果为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:FalseNone,所有类型的数字零,以及空字符串和容器(包括字符串,元组,列表,字典) ,集和frozensets)。所有其他值都被解释为true。 (有关改变这种情况的方法,请参阅__nonzero__()特殊方法。)

运算符not如果其参数为假则产生True,否则为False

表达式x and y首先评估x;如果x为假,则返回其值;否则,将评估y并返回结果值。

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

(请注意,andor都不会限制它们返回FalseTrue的值和类型,而是返回最后一个被评估的参数。这有时很有用,例如,如果s是一个字符串,如果它是一个应该被默认值替换的字符串空,表达式s or 'foo'产生所需的值。因为not无论如何都必须发明一个值,所以它并不打算返回与其参数相同类型的值,因此,例如,not 'foo'产生False,而不是''。)

另一答案

原因是Python使用所涉及变量的实际值来评估布尔表达式,而不是将它们限制为TrueFalse值。以下值被视为false:

  • None
  • False
  • 任何数字类型的0
  • 空序列或集合(''()[]{}
  • 用户定义的类型,使用__nonzero__()__len__()方法返回0或False

有关更多信息,请参阅Python文档的Truth Value Testing部分。特别是:

除非另有说明,具有布尔结果的操作和内置函数总是返回0False表示false,1True表示true。 (重要的例外:布尔运算orand总是返回其中一个操作数。)

另一答案

尝试使用括号使表达式不明确。它的方式,你得到:

(foo == bar and spam) or eggs

以上是关于Python布尔表达式和或的主要内容,如果未能解决你的问题,请参考以下文章

input框限制只能输入正整数,逻辑与和或运算

input框限制只能输入正整数,逻辑与和或运算

整数,浮点数和布尔类型

html或者php中 input框限制只能输入正整数,逻辑与和或运算

python-布尔表达式

Python3练习题系列(03)