所以我遇到了一个有趣的问题,基本上是很多函数在一个函数中返回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”的第二个函数,但这看起来非常丑陋,所以我想要可以对所有这些函数求值并返回值的东西。我没有足够的经验来编写包含多个输入以及多种输入的书写方法,因此我希望能对此提供帮助。
答案 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 expression(yield
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
只需将所有输出追加到列表中,然后评估all
或any
,那么考虑您定义的函数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