python或运算符模块

时间:2014-03-13 16:35:01

标签: python operators

operator模块上,我们有or_个功能,which is the bitwise or|)。

但是,我似乎无法找到逻辑或(or)。

文档doesn't seem to list it

我想知道为什么不包括在内?它不被视为运营商吗?

是否有提供其行为的内置函数?

4 个答案:

答案 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的原因是因为1true所以表达式已经满足。

如果您尝试执行>>> 0 or 2,可能会更有意义。它将返回2,因为第一个语句是0false,因此第二个语句将被评估。在这种情况下,2计算为true布尔值。

andor运算符计算第一个值,然后将结果插入&#34; AND和OR&#34;真相表。在and的情况下,仅在第一个值评估为true时才考虑第二个值。对于or运算符,如果第一个值的计算结果为true,则表达式为true且可以返回,如果不是,则计算第二个值。