【发布时间】:2017-11-12 13:28:44
【问题描述】:
我正在做一个练习,我要创建一个表示函数(写成 lambda 表达式)和涉及它们的几个方法的类。
目前我写的有:
class Func():
def __init__(self, func, domain):
self.func = func
self.domain = domain
def __call__(self, x):
if self.domain(x):
return self.func(x)
return None
def compose(self, other):
comp_func= lambda x: self.func(other(x))
comp_dom= lambda x: other.domain(x) and self.domain(other(x))
return Func(comp_func, comp_dom)
def exp(self, k):
exp_func= self
for i in range(k-1):
exp_func = Func.compose(exp_func, self)
return exp_func
正如你在上面看到的,函数 exp 与自身组合了一个函数 k-1 次。现在我要编写上述函数的递归 版本,采用相同的参数“self”和“k”。 但是我很难弄清楚它是如何工作的。在我写的原始 exp 中,我可以在所有迭代中访问原始函数“self”,但是在创建递归函数时,我无法访问原始函数,并且每次迭代只能访问最近组合的函数。因此,例如,如果我尝试将 self 与 self 组合一定次数,我将得到:
f= x+3
f^2= x+6
(f^2)^2= x+12
所以我们跳过了函数 x+9。
我该如何解决这个问题?有没有办法仍然保留对原始功能的访问权限?
更新:
def exp_rec(self, k):
if k==1:
return self
return Func.compose(Func.exp_rec(self, k-1), self)
【问题讨论】:
-
恕我直言,如果您必须将 lambda 分配给变量,那么最好从它进行闭包(即使用
def funcname(x):而不是funcname = lambda x: ... -
说明我要使用 lambda 表达式。