14

这个问题是为了好玩;我不希望答案有用。

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

这有效:

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

但通常你会看到:

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

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

所以假设你正在这样做:

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

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

我也想知道是否有一个内置函数可以替换or.

如果首先将参数映射到布尔值,则可以使用按位和 from 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.mulforandoperator.addfor or。这将是一个粗略的黑客攻击,我不想要这个答案......特别是考虑到如果遇到许多数字并且它们都不为零,那么乘法会变得多么昂贵!

注意:我知道all()any(),它们可以更好地替代reduce(). 正如我在顶部所说,我问这个是为了好玩。

注意:具有强制所有值的副作用的函数bool将是可接受的答案。内置and关键字不这样做:

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

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

4

3 回答 3

6

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

all/any应用于发电机也是短路的

def gen():
    yield 1
    yield this_wont_be_evaluated

print any(gen())

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

于 2013-04-11T22:41:06.713 回答
1

There are no builtin functions I'm aware of that do this. However, you can define trivial functions that wrap around the operators:

>>> 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
于 2013-04-11T22:15:12.377 回答
0

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

但内置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

那是(某种)你想要达到的目标吗?恐怕我们不能再靠近了。

于 2013-04-11T22:08:19.487 回答