Python布尔表达式和或

Zxa*_*aos 18 python syntax boolean-expression

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

foo==bar and spam or eggs
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 19

运算符andor短路意味着如果表达式的结果可以从仅评估第一个操作数推导出,则不计算第二个操作数.例如,如果你有表达式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
Run Code Online (Sandbox Code Playgroud)

和/或成语的问题(除了它让初学者感到困惑)是如果条件为真,它会给出错误的结果,但垃圾邮件评估为假值(例如空字符串).因此你应该避免它.


cod*_*ape 6

这就是Python布尔运算符的工作方式.

文档中可以看出(最后一段解释了为什么运营商按照他们的方式工作的好主意):

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false : False, None所有类型的数字零,以及空字符串和容器(包括字符串,元组,列表,字典,集合)和frozensets).所有其他值都被解释为true.(有关__nonzero__()更改此方法的方法,请参阅 特殊方法.)

如果运算符的参数为false,则运算符not产生.TrueFalse

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

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

(请注意,既不and也不or限制值并键入他们返回 FalseTrue,而是返回最后一个变量,这有时是有用的,例如,如果s是应该由如果为空,则表达式的默认值被替换的字符串s or 'foo'的产率因为not必须发明一个值,所以它并不打算返回与其参数相同类型的值,例如,not 'foo'yield False,而不是''.)