“python”或“operator怪异行为”

2024-10-01 15:45:30 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,代码:

>>> False or 'hello'
'hello'

这种令人惊讶的行为让你检查是否x!=无,并在一行中检查x值:

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

解释:“或”这样的函数:(link) 如果x为假,则y,否则x

我知道没有一种语言能让你这么做。 那么,为什么是Python呢?


Tags: or函数代码none语言falsehelloif
3条回答

实际上很多语言都有。关于Short-Circuit Evaluation请参见维基百科

出于短路评估存在的原因,维基百科写道:

If both expressions used as conditions are simple boolean variables, it can be actually faster to evaluate both conditions used in boolean operation at once, as it always requires a single calculation cycle, as opposed to one or two cycles used in short-circuit evaluation (depending on the value of the first).

听起来你好像把两个问题合并成一个问题。

首先是短路问题。马金的回答很好地解决了这个问题,所以我不会做得更好。

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

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

始终从运算符返回布尔值有助于捕获某些错误(特别是在逻辑运算符和按位运算符容易混淆的语言中),并且它允许您设计一种语言,在这种语言中,布尔检查是严格类型的检查,而不是仅检查非零,它使运算符的类型更易于写出,并且避免了在两个操作数是不同类型的情况下处理转换(请参见C族语言中的?:运算符)。所以,由于这些原因的各种组合,像C++、FORTRAN、SMALLATE和HASKELL这样的语言都是这样做的。


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

if (x or 0) < 1:

x很容易成为None时。这个特定的用例并不是很有用,因为更明确的x if x else 0(在Python 2.5和更高版本中)同样容易编写,也可能更容易理解(至少Guido是这么认为的),但也因为None < 10 < 1相同(至少在python2.x中,这两个选项中至少有一个是这样的)是类似的例子,其中有用的。比较这两个:

return launchMissiles() or -1

return launchMissiles() if launchMissiles() else -1

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


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

在1.x天内,有nobool类型。你有一些错误的值,比如None0[]()""等等,其他的都是真的,那么谁需要显式的FalseTrue?从or返回1是愚蠢的,因为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表达式的部分原因。但也有许多人不同意,而且圭多是一个仁慈的DFL。另外,让or按你期望的方式在其他地方工作,同时拒绝做你想做的事情(但是Guido不想让你做),实际上是相当复杂的。


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

No language that i know lets you do this. So, why Python do?

那你就不懂很多语言了。我想不出有一种语言,我确实知道,不表现出这种“短路”行为。

它这样做是因为它是有用的说:

a = b or K

如果b不是None(或falsy),那么a变成b,如果不是,那么它得到默认值K

相关问题 更多 >

    热门问题