Python中boolean'和','或'的运算符方法是什么?

时间:2011-02-22 22:11:09

标签: python parsing operator-keyword

例如,这些是在operator module中定义的,可以这样使用:

import operator
print operator.__add__   # alias add -> +
print operator.__sub__   # alias sub -> -
print operator.__and__   # alias and_ -> &
print operator.__or__    # alias or_ -> |

那么andor等同于什么?

print operator."and ?????"  # should be boolean-and
print operator."or ????"    # should be boolean-or

3 个答案:

答案 0 :(得分:12)

andor运算符在运算符模块中没有等效运算符,因为它们不能作为函数实现。这是因为它们是短路的:它们可能不会根据第一个操作数的结果来评估它们的第二个操作数。

答案 1 :(得分:6)

这些不存在。你能做的最好的事就是用lambda替换它们:

band = (lambda x,y: x and y)
bor = (lambda x,y: x or y)

原因是您无法实现andor的完整行为,因为它们可能会短路。

E.G:

if variable or long_fonction_to_execute():
    # do stuff

如果variableTrue,则永远不会调用long_fonction_to_execute,因为Python知道,or无论如何都必须返回True。这是一个优化。在大多数情况下,这是一个非常理想的功能,因为它可以节省大量无用的处理。

但这意味着你无法使它成为一种功能:

E.G:

if bor(variable, long_fonction_to_execute()):
    # do stuff

在这种情况下,即使在评估之前,也会调用long_fonction_to_execute

幸运的是,鉴于您使用生成器和列表推导这一事实,您很少需要这样的东西。

答案 2 :(得分:3)

延伸电子满意答案:

lazyand = (lambda x,y: x() and y())
lazyor = (lambda x,y: x() or y())

这里的区别在于传入的条件是本身thunks (形式为“( - - > value”)的函数),它们仅根据需要进行评估。 (可以说只有y需要进行懒惰评估,但为了保持一致性,我这样写了。

也就是说,这会保留and(和or)的“懒惰”方面,代价是更详细的代码和更多的对象/方法调用。

andexpr = lazyand(lambda: false, lambda: never_executed())
andexpr() # false

我很难实际建议使用这种方法 - 重要的是要注意这些thunk必须显式,如上所示。这可能是它未包含在operator模块中的一个原因。其他一些语言允许按名称或隐式“提升”。

快乐的编码。