评估数字表达式
有人能解释一下为什么在计算数字表达式时,Python会返回最后一个被计算的结果吗?
举个例子:
3 and 5
这个表达式的结果是
5
我还有一个问题,为什么它会计算这些表达式呢?当我尝试检查时:
3 == True
我得到的是 False,但当我计算:
3 and 5
结果是 5,显然(我觉得)它认为 3 是 True,因为如果它认为不是的话,就不会继续计算了(我可能错了)。
相对来说,当我计算:
0 and 3
我得到的是 0,我认为发生的事情是 Python 检查 0 是否为 True,结果判断不是,然后就输出了这个结果。
抱歉如果这些听起来有点混乱,但我在书里碰到这个问题,想知道我是不是漏掉了什么。
3 个回答
0
布尔运算是怎么工作的
可以查看关于布尔运算的文档。它们的工作原理如下:
a or b
会返回第一个被判断为True
的元素,比如在0 or 3
的情况下,它会返回3
;在3 or 5
的情况下,它也会返回3
。a and b
会返回第一个被判断为False
的元素,如果所有元素都被判断为True
,那么就返回最后一个元素。所以0 and 3
会返回0
,而3 and 5
会返回5
。
解决方案
不过你的问题是有解决办法的。只需使用bool()
将结果转换为布尔值:
>>> bool(0 or 3)
True
>>> bool(3 or 5)
True
>>> bool(0 and 3)
False
>>> bool(3 and 5)
True
这样有帮助吗?
编辑:
另一种解决方案
其实我觉得在你的情况下,可能还有更好的解决办法。看看这个:
bool(a or b)
可以用any([a, b])
来替代,bool(a and b)
可以用all([a, b])
来替代。
我现在认为这是一种更合理的解决方案。
2
来自Python参考资料:
The expression x and y first evaluates x; if x is false, its value is returned;
otherwise, y is evaluated and the resulting value is returned.
如果你说的是
0 and 5
那么第一个被计算的值(0)会被返回。
对于第二个问题,3在当作布尔值时显然是“真”,但是==
这个运算符在比较之前并不会把它的参数转换成布尔值。
3
在Python中,任何值都可以分为“真值”和“假值”。除了0以外,所有整数都是“真值”。使用布尔运算符or
和and
时,Python会返回它最后计算的表达式。例如,3 or 5
会返回3,因为Python首先判断3是“真值”,所以不需要再计算5,直接返回3。
在0 and 5
中,0是“假值”,所以Python不会继续计算下一个表达式,直接返回0。
至于5 == True
返回False
的原因是,5并不等于True,它在布尔表达式中只是表现得像“真值”。而bool(5) == True
返回True
,因为这条语句明确地把整数转换成了布尔值。