如何依次执行多个函数
我想要执行多个函数。每个函数都返回True或False。所以如果一个函数返回True,我想执行下一个函数。 etc ...如何依次执行多个函数
所有的功能没有必要有相同的参数。
现在我有这样的:
res=function1()
if res:
res=function2()
if res:
res=function2()
它的推移和像20层的功能。有一个更好的方法吗 ?
预先感谢您...
好了,你可以定义自己的方式做到这一点,但我会做这样的:
my_functions = (
(my_func1, [2, 5], {'kwarg1': 'val1'}),
# ...
)
for function, args, kwargs in my_functions:
if not function(*args, **kwargs):
break
根据注释编辑。伟大的见解!
你可以采取and
运营商的短路行为的优势:
function1() and function2() and function3() and ...
如果function1
返回True
function2
才会被调用,function3
只会如果function1
和function2
返回True
等等。
虽然它并不一定是非常的Pythonic。
因为你总是分配给res
,也可以只保留if
小号平:
res = function1()
if res:
res = function2()
if res:
res = function3()
这可能被认为更具可读性,但它确实浪费了大量的垂直空间。尽管如此,至少你并不是在嵌套if
。
我可能会使用partial
,使零参数的功能,你可以遍历(而不是某种结构与功能及其参数),而不是把它变成
functions = [
functools.partial(func1, arg1a, arg1b),
functools.partial(func2),
functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
]
然后一个list
并遍历它,你可以叫all
:
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
(或任何虚假-Y),或运行所有功能并返回True
,如果它们全都返回True
(或任何其他值为真的)。由于文档说,它等同于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
这是值得的partial
小号比较的tuple
S IN对方的回答,其作为伪谐音,无论是在他们是如何定义和他们是如何”重新叫:
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的答案一样)拨打电话与元组拆包更具可读性,但它仍然永远不会像使用真实部分一样简单。
Python社区往往害怕'functools',但对我的钱来说,这是最具可读性的。 – Cairnarvon 2013-02-26 20:28:11
@Cairnarvon:也许Python 2.x社区或从10年前的书中学到的人害怕functools,但实际的Python开发人员在整个地方都使用“partial”。例如,Guido的“郁金香”例子充满了它。用它代替存储在'tuple's中的'lambda'函数或伪部分就是它的存在。 – abarnert 2013-02-26 20:30:13
+1与元组方法进行比较。如果人们仍然害怕'functools',这个例子很明显,他们不应该。 – rainer 2013-03-01 08:58:50
没有必要弄得太复杂:
res = function1()
res = res and function2()
res = res and function3()
...
这看起来有点奇怪,但会做你想要什么,而不必左右扭动函数调用自己变成字典什么的清单。这只是一个写Cairnarvon的回答更长的路:
res = (
function1() and
function2() and
function3() and
...
)
如果元组来代替它也可以写成一本字典: '对于f,指定参数时,kwargs在my_functions: 如果不是F(*指定参数时, ** kwargs): break' 虽然效果相同 – 2013-02-26 20:03:26
@abarnert原始版本是一个列表,但现在我已将它更改为元组。 – aemdy 2013-02-26 20:13:33