如何一个接一个地执行多个函数

1 投票
4 回答
3712 浏览
提问于 2025-04-17 17:13

我想要一个一个地执行很多个函数。每个函数都会返回一个真(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;只有当 function1function2 都返回 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

根据评论进行了编辑。真是个好主意!

撰写回答