首页 > 解决方案 > 将函数及其参数附加到列表而不立即调用该函数

问题描述

我想做这样的事情:

lst = []
lst.append( func1(a, b, c, d) ) # do NOT execute function here/now
lst.append( func2(e, f) )       # do NOT execute function here/now
lst.append( func3(w, x, y) )    # do NOT execute function here/now

# ... later
for f in lst:
    result = f # execute function here/now

在 Python 中完成此任务的最简单方法是什么?

标签: pythonfunction

解决方案


您可以使用func(*args)语法来提供位置参数的元组:

lst = []
lst.append( (func1, a, b, c, d) )
lst.append( (func2, e, f) )
lst.append( (func3, w, x, y) )

for func, *args in lst:
    result = func(*args)

或者,只需使用 lambda 保护每个函数调用:

lst = []
lst.append(lambda: func1(a, b, c, d))
lst.append(lambda: func2(e, f))
lst.append(lambda: func3(w, x, y))

for f in lst:
    result = f()

第二个版本存在一些细微的错误,因为在a创建 lambda 时不会评估参数名称(例如 ),而是在调用lambda 时评估它们- 这意味着如果在和调用a之间发生变化append,这两个解决方案会给出不同的结果,第一个可能是你想要的。所以我建议避免使用第二个,除非参数只是常量。


推荐阅读