在operator
模块上,我们有or_
个功能,which is the bitwise or(|
)。
但是,我似乎无法找到逻辑或(or
)。
我想知道为什么不包括在内?它不被视为运营商吗?
是否有提供其行为的内置函数?
答案 0 :(得分:14)
or
运算符短路;当左侧返回真值时,不评估右侧表达式。这也适用于and
运算符;当左侧表达式返回false值时,不评估右侧表达式。
你不能用一个功能做到这一点;在调用函数之前,要评估所有操作数 。因此,operator
模块中没有相应的功能。
比较
foo = None
result = foo and foo(bar)
与
foo = None
result = operator.boolean_and(foo, foo(bar)) # hypothetical and implementation
后一个表达式将失败,因为您不能将None
用作可调用对象。第一个版本有效,因为and
运算符不会评估foo(bar)
表达式。
答案 1 :(得分:6)
与内置or
功能最接近的是any:
>>> any((1, 2))
True
如果您想复制or
返回非布尔操作数的功能,可以将next与过滤器一起使用:
>>> next(operand for operand in (1, 2) if operand)
1
但是像Martijn所说的那样,or
都没有真正的替代品,因为它会短路。真正的or
函数必须接受函数才能避免评估所有结果:
logical_or(lambda: 1, lambda: 2)
这有点笨拙,并且与operator
模块的其余部分不一致,所以最好省略它而你使用其他显式方法。
答案 2 :(得分:1)
This can explicitly be found in the docs:
表达式x或y首先计算x;如果x为真,则其值为 回;否则,评估y并得到结果值 返回。
它不作为operator
函数存在,因为由于语言规范,它不可能实现,因为在调用函数时不能延迟执行被调用的参数。以下是or
的实例示例:
def foo():
return 'foo'
def bar():
raise RuntimeError
如果调用bar,则会出现运行时错误。查看以下行,我们看到Python快捷键对行的评估,因为foo
返回True
- ish值。
>>> foo() or bar()
'foo'
我们可以通过传入未调用的函数来模拟这种行为,然后在我们的or
函数中调用它们:
def my_or(*funcs):
for func in funcs:
call = func()
if call:
return call
return call
>>> my_or(foo, bar)
'foo'
但你无法快捷执行传递给函数的被调用callables:
>>> my_or(foo, bar())
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
like_or(foo, bar())
File "<pyshell#24>", line 2, in bar
raise RuntimeError
RuntimeError
因此,在内置插件或标准库中包含这样的函数是不合适的,因为用户希望or
函数能够像布尔or
测试一样工作, ,是不可能的。
答案 3 :(得分:-2)
执行1
后获得>>> 1 or 2
的原因是因为1
是true
所以表达式已经满足。
如果您尝试执行>>> 0 or 2
,可能会更有意义。它将返回2
,因为第一个语句是0
或false
,因此第二个语句将被评估。在这种情况下,2
计算为true
布尔值。
and
和or
运算符计算第一个值,然后将结果插入&#34; AND和OR&#34;真相表。在and
的情况下,仅在第一个值评估为true
时才考虑第二个值。对于or
运算符,如果第一个值的计算结果为true
,则表达式为true且可以返回,如果不是,则计算第二个值。