说你有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
答案 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
将评估为False
而all()
将停止迭代生成器。