在Python中使用布尔列表中的min / max是不是很糟糕?

时间:2016-12-05 18:03:13

标签: python python-3.x

所以我有条件只有当列表中的所有项都评估为true时才会发生。这个例子可能就像一个返回布尔值的函数列表(实际上不是我的情况,但更容易解释):

def foo():
    # do something
def bar():
    # do something
def baz():
    # do something

fncs = [foo, bar, baz]
if <every element in [fnc() for fnc in fncs] evaluates to true>:
    # do something

我知道我绝对可以这样做:

all_true = True
for fnc in fncs:
    if not fnc():
        all_true = False
if all_true:
    # do something

但是,我想知道这是不是很糟糕:

if min([fnc() for fnc in fncs]):
    # do something

或者,我可以尝试在列表理解期间选择所有错误元素并检查列表是否被占用(这是因为bool(arr)其中arr是列表返回False当且仅当arr为空时):

if not [None for fnc in fncs if not fnc()]:
    # do something

我感觉像是&#34; min&#34;比上一种方法要清晰得多,虽然第一种方法对于新手来说最容易理解,但应该很清楚它是怎么回事。我可以通过别名来更清楚地说明:

all_true = min
if all_true([fnc() for fnc in fncs]):
    # do something

我确定我也错过了其他方法。我想知道哪种方法最合适。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用min不是“坏”,但 不清楚您要做什么,并会做不必要的工作。您应该使用all代替。

if all(fnc() for fnc in fncs):
    # do something

如果所有值均为True,则返回True,否则返回False。如果任何值为False,则它具有额外的退出优势,与min不同,False必须至少运行整个序列一次。

如果您发现需要评估是否全部not any(...),我建议any(具体而言,{{1}},具体而言)“类似”尽快退出“行为。

答案 1 :(得分:1)

您可能正在寻找 all 内置功能:

print all(f() for f in [foo, bar, baz])