>> False or 'hello' 'hello' 这种令人惊讶的行为让您可以检查 x 是否不是 None 并在一行中检查 x 的值: >>> x = 10 if randint(0-6ren">
gpt4 book ai didi

python - "or"运算符不返回 bool 的动机是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:00:24 31 4
gpt4 key购买 nike

先上代码:

>>> False or 'hello'
'hello'

这种令人惊讶的行为让您可以检查 x 是否不是 None 并在一行中检查 x 的值:

>>> x = 10 if randint(0,2) == 1 else None
>>> (x or 0) > 0
# depend on x value...

说明:功能类似于this :

if x is false, then y, else x

我所知道的任何语言都无法做到这一点。那么,为什么 Python 呢?

最佳答案

听起来您正在将两个问题合二为一。

首先,存在短路问题。 Marcin 的回答完美地解决了这个问题,所以我不会尝试做得更好。

其次,有 orand返回最后计算的值,而不是将其转换为 bool。两种方式都有争论,你可以在分歧的两边找到许多语言。

返回最后计算的值允许 functionCall(x) or defaultValue快捷方式,避免了可能浪费的转换(为什么要将 int 2 转换为 bool 1 如果您唯一要做的就是检查它是否非零?),并且通常是更容易解释。因此,由于这些原因的各种组合,C、Lisp、Javascript、Lua、Perl、Ruby 和 VB 等语言都以这种方式做事,Python 也是如此。

始终从运算符返回 boolean 值有助于捕获一些错误(尤其是在逻辑运算符和按位运算符容易混淆的语言中),并且它允许您设计一种语言,其中 boolean 检查是严格类型检查对于 true它不仅检查非零值,还使运算符的类型更容易写出,并且避免了在两个操作数类型不同的情况下处理转换(参见 C 系列语言中的 ?: 运算符)。因此,由于这些原因的各种组合,C++、Fortran、Smalltalk 和 Haskell 等语言都以这种方式做事。


在您的问题中(如果我理解正确的话),您正在使用此功能来编写如下内容:

if (x or 0) < 1:

x很容易成为None .这个特定的用例不是很有用,因为更明确的 x if x else 0 (在 Python 2.5 及更高版本中)同样易于编写并且可能更易于理解(至少 Guido 这么认为),而且还因为 None < 10 < 1相同无论如何(至少在 Python 2.x 中,所以你总是至少有两个选项之一)......但是有类似的例子,它很有用。比较这两个:

return launchMissiles() or -1

return launchMissiles() if launchMissiles() else -1

第二个将浪费大量导弹,两次而不是一次炸毁你在南极洲的敌人。


如果你很好奇为什么 Python 会这样做:

回到 1.x 时代, 没有 bool类型。你有像 None 这样的虚假值, 0 , [] , () , ""等,其他一切都是真实的,所以谁需要显式 FalseTrue ?返回1来自 or会很傻,因为1不比 [1, 2, 3] 更真实或 "dsfsdf" .到时候bool添加(逐渐超过两个 2.x 版本,IIRC),当前逻辑已经牢固地嵌入到语言中,并且更改会破坏很多代码。

那么,他们为什么不在 3.0 中更改它?许多 Python 用户,包括 BDFL Guido,会建议您不要使用 or在这种情况下(至少因为它违反了“TOOWTDI”);您应该将表达式的结果存储在变量中,例如:

missiles = launchMissiles()
return missiles if missiles else -1

事实上,Guido 已经表示他想禁止 launchMissiles() or -1 ,这也是他最终接受三元 if 的部分原因- else他之前多次拒绝的表达。但许多其他人不同意,Guido 是一名仁慈 DFL。另外,制作or按照您在其他任何地方期望的方式工作,同时拒绝在这里做您想做的事(但 Guido 不希望您做),实际上会非常复杂。


因此,在这里,Python 可能永远与 C、Perl 和 Lisp 站在同一边,而不是与 Java、Smalltalk 和 Haskell 站在同一边。

关于python - "or"运算符不返回 bool 的动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870378/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com