这个问题只是为了好玩,我并不指望得到有用的答案。
当我看到人们在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
操作。但这只是个粗略的hack方法,我不想要这个答案……特别是当遇到许多数字且它们都不是零时,乘法会变得非常耗费资源!
注意:我知道all()
和any()
,它们是对reduce()
更好的替代品。如我在前面所说,我只是出于兴趣而问这个问题。
注意:一个有副作用的函数,可以强制所有值转换为bool
,这也是一个可接受的答案。内置的and
关键字并不具备这个功能:
x = 3 and 5 # sets x to 5, not to True
但是对于这个问题,我只关心一个能够与reduce()
一起使用来执行逻辑and
或or
操作的函数。
any((a, b))
来代替a or b
,用all((a, b))
来代替a and b
。当然,这样你得要创建元组,并且没有短路功能... - kindallx = 3 and 5
将x
设为5
,但你也可以将其转换为布尔值,那么为什么不这样做呢?重点是无论你尝试在哪个逻辑表达式中评估x
,它都会被解释为布尔值。 - whatyouhideboth
和either
添加到operator
模块中,作为按位and_
和or_
的逻辑对应物。 - Mark Ransomany
和all
接受多个参数的建议,它们完全可以像min
和max
一样工作。 - Mark Ransom