这个问题很有趣;我不认为答案是有用的。
当我看到人们在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
使用and
,operator.add
使用or
。这将是一个粗暴的黑客,我不想要这个答案......特别是考虑到如果遇到很多数字并且没有一个是零,乘法会得到多大的代价!
注意:我知道all()
和any()
,这是使用reduce()
的更好替代品。正如我在顶部所说,我要求这很有趣。
注意:具有将所有值强制为bool
的副作用的函数将是可接受的答案。内置的and
关键字不会执行此操作:
x = 3 and 5 # sets x to 5, not to True
但是出于这个问题的目的,我只对能够使用reduce()
进行逻辑and
或or
操作的函数感兴趣。
答案 0 :(得分:6)
我想运算符模块中没有and
和or
的实际原因是,不可能以短路方式评估函数参数 - 这是布尔运算符的全部要点。所以问题的答案是否定的,没有内置函数可以模仿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()
,reduce
和map
模仿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
是什么(你想要实现的)?我担心我们不能再靠近了。