这个问题很有趣; 我不认为答案是有用的.
当我看到人们reduce()在Python中做事时,他们经常利用Python中的内置函数,通常来自operator模块.
这有效:
result = reduce(lambda a, b: a + b, range(5))
Run Code Online (Sandbox Code Playgroud)
但通常你会看到这个:
from operator import add
result = reduce(add, range(5))
Run Code Online (Sandbox Code Playgroud)
对我来说很奇怪的是operator模块似乎没有逻辑功能and.它有点按位,但不符合逻辑and.
所以假设你这样做:
result = reduce(lambda a, b: a and b, range(1, 6))
Run Code Online (Sandbox Code Playgroud)
是否有可以在这里使用的内置函数?
我也想知道是否有可以替换的内置函数or.
如果你首先将参数映射到布尔值,你可以使用bitwise和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)))
Run Code Online (Sandbox Code Playgroud)
并且同样用于operator.or_()或bool.__or__用于or操作.但我正在寻找一个不需要映射到布尔值的值的函数.
如果您确定您的值都是整数,则可以使用operator.mulfor and和operator.addfor or.这将是一个粗暴的黑客,我不想要这个答案......特别是考虑到如果遇到很多数字并且没有一个是零的话,乘法会有多昂贵!
注意:我知道all()并且any(),这是更好的替代品reduce().正如我在顶部所说,我要求这很有趣.
注意:具有强制所有值的副作用的函数bool将是可接受的答案.内置and关键字不会执行此操作:
x = 3 and 5 # sets x to 5, not to True
Run Code Online (Sandbox Code Playgroud)
但是出于这个问题的目的,我只对一个可以reduce()用来做逻辑and或or操作的函数感兴趣.
我想实际的原因,有没有and和or运营商模块中,这是不可能在一个短路的方式来评估函数参数-这是布尔操作的关键所在.所以问题的答案是否定的,没有内置函数可以模仿and/or也不可能写一个.
all/any 应用于发电机也是短路的
def gen():
yield 1
yield this_wont_be_evaluated
print any(gen())
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用运行时参数