【发布时间】:2019-03-12 19:08:48
【问题描述】:
假设有一个函数g 我想通过链接子函数来实现。这可以通过以下方式轻松完成:
def f1(a):
return a+1
def f2(a):
return a*2
def f3(a):
return a**3
g = lambda x: f1(f2(f3(x)))
但是,现在考虑一下,哪些子功能将被链接在一起,这取决于条件:具体而言,预先知道的用户指定选项。当然可以:
def g(a, cond1, cond2, cond3):
res = a
if cond1:
res = f3(res)
if cond2:
res = f2(res)
if cond3:
res = f1(res)
return res
但是,与其在每次调用函数时动态检查这些静态条件,我认为最好提前根据其组成函数定义函数g。
不幸的是,下面给出了RuntimeError: maximum recursion depth exceeded:
g = lambda x: x
if cond1:
g = lambda x: f3(g(x))
if cond2:
g = lambda x: f2(g(x))
if cond3:
g = lambda x: f1(g(x))
有没有在 Python 中进行这种条件链接的好方法?请注意,要链接的函数可以是 N 个,因此不能单独定义所有 2^N 个函数组合(本例中为 8 个)。
【问题讨论】:
-
g = lambda x: f(g(x))会炸毁你的堆栈,因为尾调用永远不会结束。 -
你打算如何定义那些 N 函数?它们都将被命名为函数,所以
f1, f2, ...fN或者你会将它们放入dict之类的吗?我问是因为这几乎可以定义如何有效地链接它们。 -
你可以假设它们都是命名函数。
-
@RockyLi 是的,基本上我是想避免递归,而是使用
g作为之前在代码中定义的函数对象 -
这可以通过将条件写成
g = lambda x, g=g: f3(g(x))来实现(并不是说这一定是个好主意)(默认参数捕获g的先前值,而不是递归引用新值)。