如何一个接一个地执行多个函数
我想要一个一个地执行很多个函数。每个函数都会返回一个真(True)或者假(False)。所以如果某个函数返回真,我就想执行下一个函数,依此类推……
这些函数不一定需要相同的参数。
现在我有类似这样的代码:
res=function1()
if res:
res=function2()
if res:
res=function2()
然后我还要继续写大约20个函数。有没有更好的方法来做到这一点呢?
提前谢谢你……
4 个回答
2
你可以利用 and
运算符的短路特性:
function1() and function2() and function3() and ...
只有当 function1
返回 True
时,才会调用 function2
;只有当 function1
和 function2
都返回 True
时,才会调用 function3
,依此类推。
不过,这样写不一定很符合 Python 的风格。
因为你总是给 res
赋值,所以你也可以把 if
语句写得简单一些:
res = function1()
if res:
res = function2()
if res:
res = function3()
这样可能更容易阅读,但会浪费很多垂直空间。不过,至少你没有把 if
嵌套得很深。
4
我可能会用partial
来创建一些不需要参数的函数,这样你就可以在循环中使用它们,而不是用某种结构来存放函数和它的参数。
functions = [
functools.partial(func1, arg1a, arg1b),
functools.partial(func2),
functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
]
然后,你可以直接调用all
,而不是把它们放进一个list
里再去遍历:
retval = all(func() for func in (
functools.partial(func1, arg1a, arg1b),
functools.partial(func2),
functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
))
这样的话,只要有一个函数返回False
(或者其他任何被认为是假的值),就会立即返回False
。如果所有函数都返回True
(或者其他任何被认为是真的值),那么就会运行所有的函数并返回True
。正如文档所说,这相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
值得把partial
和另一个答案中的tuple
进行比较,后者在定义和调用上都像是伪partial
:
f1 = functools.partial(func, arg1, arg2, kw1=kwarg1, kw2=kwarg2)
f2 = (func1, (arg1a, arg1b), {'kw1': kwarg1, 'kw2': kwarg2 })
f1()
f2[0](*f2[1], **f2[2])
显然,你可以(而且应该,正如aemdy的答案所做的那样)通过解包元组来让调用更易读,但这仍然没有真正的partial
简单。
8
当然,你可以自己定义一种方法来实现这个,但我会这样做:
my_functions = (
(my_func1, [2, 5], {'kwarg1': 'val1'}),
# ...
)
for function, args, kwargs in my_functions:
if not function(*args, **kwargs):
break
根据评论进行了编辑。真是个好主意!