在Python中是否存在`和`和/或`或`的内置函数版本?

时间:2013-04-11 21:50:41

标签: python

这个问题很有趣;我不认为答案是有用的。

当我看到人们在Python中使用reduce()做事时,他们经常利用Python中的内置函数,通常来自operator模块。

这有效:

result = reduce(lambda a, b: a + b, range(5))

但通常你会看到这个:

from operator import add
result = reduce(add, range(5))

对我来说奇怪的是operator模块似乎没有逻辑and的功能。它确实有按位,但不是逻辑and

假设你这样做:

result = reduce(lambda a, b: a and b, range(1, 6))

是否有可以在这里使用的内置函数?

我也想知道是否有可以取代or的内置函数。

如果您首先将参数映射到布尔值,则可以使用按位和operator,或者直接使用bool.__and__,如下所示:

from operator import and_
result = reduce(and_, map(bool, range(1, 6)))
result = reduce(bool.__and__, map(bool, range(1, 6)))

operator.or_()操作同样bool.__or__or。但我正在寻找一个不需要映射到布尔值的值的函数。

如果您确定您的值都是整数,则可以operator.mul使用andoperator.add使用or。这将是一个粗暴的黑客,我不想要这个答案......特别是考虑到如果遇到很多数字并且没有一个是零,乘法会得到多大的代价!

注意:我知道all()any(),这是使用reduce()的更好替代品。正如我在顶部所说,我要求这很有趣。

注意:具有将所有值强制为bool的副作用的函数将是可接受的答案。内置的and关键字不会执行此操作:

x = 3 and 5  # sets x to 5, not to True

但是出于这个问题的目的,我只对能够使用reduce()进行逻辑andor操作的函数感兴趣。

3 个答案:

答案 0 :(得分:6)

我想运算符模块中没有andor的实际原因是,不可能以短路方式评估函数参数 - 这是布尔运算符的全部要点。所以问题的答案是否定的,没有内置函数可以模仿and/or,也不可能写一个。

应用于发电机的

all/any也是短路的

def gen():
    yield 1
    yield this_wont_be_evaluated

print any(gen())

但我不知道如何使用运行时参数

答案 1 :(得分:1)

我没有意识到这样做的内置函数。但是,您可以定义包含运算符的简单函数:

>>> def newand(a,b):
...  return a and b
...
>>> def newor(a,b):
...  return a or b
...
>>> reduce(newand, map(bool, range(5))) # Will return False, because bool(0) == False
False
>>> reduce(newand, map(bool, range(1,5))) # Now 0 is excluded
True

答案 2 :(得分:0)

  

注意:具有强制所有值的副作用的函数   布尔将是一个可以接受的答案。内置和关键字没有   这样做

但是内置的not关键字可以。

In : not 255
Out: False

In : not 0
Out: True

当然,你必须让你的逻辑倒退,然后:

In : not (not 5 and not 0) # mimics: 5 or 0
Out: True

因此,您可以通过all()reducemap模仿operator.*

In : not reduce(operator.or_,map(operator.not_,[1,2,3,4,5])) # mimics all(1,2,3,4,5)
Out: True

In : not reduce(operator.or_,map(operator.not_,[1,2,3,0,5])) # mimics all(1,2,3,0,5)
Out: False

是什么(你想要实现的)?我担心我们不能再靠近了。