评估返回True或False的多个函数的输出

时间:2019-04-16 10:55:25

标签: python-3.x

所以我遇到了一个有趣的问题,基本上是很多函数在一个函数中返回True或False,我希望该辅助函数基于对所有对象应用AND或OR逻辑返回True或False。其中的功能。我知道这是一种糟糕的解释方式,所以让我们看一些希望可以更好地解释它的代码

#this is the first function that return True or False
def f(x):
    if x == 1:
        return True
    elif x == 0:
        return False
#this is the function that takes the first one and I want it to return either True or False based on an AND logic
def g(f):

    f(1)
    f(0)
    f(0)
    f(1)
    f(1)
    f(0)
    f(1)

现在,我知道我可以在所有调用的f(x)函数之间编写带“ and”的第二个函数,但这看起来非常丑陋,所以我想要可以对所有这些函数求值并返回值的东西。我没有足够的经验来编写包含多个输入以及多种输入的书写方法,因此我希望能对此提供帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用all和对该功能的变量参数(*args)的理解:

>>> def f(x):
...     if x == 1:
...         return True
...     elif x == 0:
...         return False
... 
>>> def g(f, *args):
...     return all(f(x) for x in args)
... 
>>> g(f, 1, 0, 0, 1)
False
>>> g(f, 1, 1, 1)
True

答案 1 :(得分:1)

您可以使用等效于逻辑AND的现有all函数:

def f(x):
  return x < 5

all((f(1), f(2), f(3), f(4)))

现在有关功能g,您可以执行此操作(例如):

def g(f, inputs):
  for i in inputs:
    yield f(i)

all(g(f, range(5)))

在这里,您可以将range(5)替换为[0, 1, 2, 3, 4](0, 1, 2, 3, 4){0, 1, 2, 3, 4}中的任何一个,以及更多(例如,任何可迭代的)。

请注意,python中还存在类似于g的函数,称为map,您可以通过以下方式使用它:

all(map(f, range(5))) # More or less equivalent to all(g(f, range(5))) 

您也可以直接使用generator expressionyield generator格式的替代形式):

all(f(i) for i in range(5))

该解决方案中哪一个是最佳解决方案,实际上取决于用例和您的个人喜好(即使最后一个可能是您最常看到的解决方案)。

答案 2 :(得分:0)

对于AND函数,可以使用python的all,对于OR函数,可以使用python的any

>>> all([True, False])
False
>>> all([True, True])
True
>>> any([True, False])
True
>>> any([True, True])
True
>>> any([False, False])
False

只需将所有输出追加到列表中,然后评估allany,那么考虑您定义的函数f

print(all([f(1),f(1)]))
print(all([f(0),f(0)]))
print(any([f(1), f(0)]))
print(any([f(0), f(0)]))
#True
#False
#True
#False