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

ste*_*eha 14 python

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

当我看到人们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 andoperator.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()用来做逻辑andor操作的函数感兴趣.

geo*_*org 6

我想实际的原因,有没有andor运营商模块中,这是不可能在一个短路的方式来评估函数参数-这是布尔操作的关键所在.所以问题的答案是否定的,没有内置函数可以模仿and/or也不可能写一个.

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

def gen():
    yield 1
    yield this_wont_be_evaluated

print any(gen())
Run Code Online (Sandbox Code Playgroud)

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

  • 这正是问题的答案:操作员模块中没有"和"和"或"函数,因为您无法定义这些函数.具有接近但不相同的功能只会产生误导. (3认同)
  • 我认为短路只是逻辑运算符的有用属性,而不是"整点". (2认同)