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
运算符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
Run Code Online (Sandbox Code Playgroud)
和/或成语的问题(除了它让初学者感到困惑)是如果条件为真,它会给出错误的结果,但垃圾邮件评估为假值(例如空字符串).因此你应该避免它.
这就是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限制值并键入他们返回False和True,而是返回最后一个变量,这有时是有用的,例如,如果s是应该由如果为空,则表达式的默认值被替换的字符串s or 'foo'的产率因为not必须发明一个值,所以它并不打算返回与其参数相同类型的值,例如,not 'foo'yieldFalse,而不是''.)
| 归档时间: |
|
| 查看次数: |
17597 次 |
| 最近记录: |