如何使用条件加载来命令长if语句?

时间:2015-05-29 22:29:57

标签: python conditional-statements

说你有10个以上的条件需要是真的有更好的写作方式:

if condition1 and condition2 and condition3 and condition4.......:
    return value

添加了规定,他们不能提前评估,必须按顺序运行。 condition1需要为true才能运行,否则会出错。

我试图阻止的是

test = False 
if all([test, test.func(returns either true or false)]): 
    pass 
= AttributeError: 'bool' object has no attribute 'func' 

模仿此功能

if condition1:
    if condition2:
       ......
        if condition13:
            return True

1 个答案:

答案 0 :(得分:3)

您可以使用all()内置(采用可迭代的表达式):

if all([condition1, condition2, ...]):
    return value

将按顺序评估表达式 (因为all()需要一个可迭代的),所以在此示例中从左到右依次列出。

只要all()遇到第一个求值为False的表达式,它就会短路并停止从迭代中拉出表达式。如果您的表达式的评估成本很高,您可以通过将其传递给生成器而不是预先构建的序列来利用它。

这是一个使用generator的更高级示例,以便利用短路来避免评估以后的表达式:

def fail():
    raise Exception("Boom")

def conditions():
    yield 1 == 1
    yield 2 == 42
    yield fail()

if all(conditions()):
    print "All True"
else:
    print "Not all True"

因此调用conditions()将返回一个生成器对象。迭代该生成器将导致该函数中的代码运行到第一个yield语句,然后在该yield之后计算表达式,将结果作为第一个项返回。然后暂停生成器中的代码,直到all()拉出下一个值,这将恢复代码并运行它直到遇到下一个yield语句等。

因此,永远不会调用fail()因为2 == 42将评估为Falseall()将停止迭代生成器。