如何使用python实现“一元函数链表”?

如何使用python实现“一元函数链表”?,python,Python,我在做代码战,我赢不了这个挑战。 以下是链接: 这是我的实现,但有一个错误'TypeError:'generator'对象不可调用 “: 注意:链接([f1,f2,f3])(0)的reuslt是4 以下是tese案例: test.assert_equals( chained([f1,f2,f3])(0), 4 ) test.assert_equals( chained([f1,f2,f3])(2), 36 ) test.assert_equals( chained([f3,f2,f1])(2)

我在做代码战,我赢不了这个挑战。 以下是链接:

这是我的实现,但有一个错误'TypeError:'generator'对象不可调用 “:

注意:链接([f1,f2,f3])(0)的reuslt
4

以下是tese案例:

test.assert_equals( chained([f1,f2,f3])(0), 4 )
test.assert_equals( chained([f1,f2,f3])(2), 36 )
test.assert_equals( chained([f3,f2,f1])(2), 12 )

您不需要返回生成器,而是需要返回一个函数,该函数接受一个参数并将其应用于每个链接函数

您的调用语法是:

chained([f1, f2, f3])(0)
这意味着您希望
chained
返回可以使用单个参数调用的内容。函数就可以了

将起作用的功能是:

def apply(param):
    result = param
    for f in functions:
        result = f(result)
    return result
这将使用上一个函数调用的结果调用每个函数。首先,使用初始参数

但是,由于没有将函数列表传递给只接受一个参数的函数,因此需要以其他方式捕获它们。您可以在函数中定义函数,它可以捕获任何局部变量:

def chained(functions):
    def apply(param):
        result = param
        for f in functions:
            result = f(result)
        return result
    return apply
定义函数
apply
本地捕获
函数
参数。然后我们返回函数以便调用它,本质上是
apply(0)


生成器应该被迭代。而不是:

print chained([f1, f2, f3])(0)
尝试:


您可以使用
reduce

这将获取函数列表,并将值依次应用于每个函数。因此,将使用第一个函数,并返回一个值。然后,将采用第二个函数,并将其应用于新值

fs = [f1, f2, f3] 
print reduce( lambda val, f: f(val) , fs, 0 )
您需要的是一个链式函数
,它返回另一个接受一个变量的函数。采用一个变量(比如
m
)的示例函数是
lambda m:m*2

现在有一个函数返回另一个取一个值的函数吗

def retFunc(): return (lambda m: m*2)
因此,我们只是结合上述两个想法,并有

def chained(fs):
    return (lambda m: reduce( lambda val, f: f(val) , fs, m))

print chained(fs)(0)
这里,
chained(fs)
获取函数列表
fs
,并返回函数
lambda m:reduce(lambda val,f:f(val),fs,m)
。这是一个函数,它将
m
reduce
s所有函数按顺序排列

因此,
chained(fs)(0)

变为
(λm:reduce(λval,f:f(val),fs,m))(0)

变为
(减少(lambda val,f:f(val),fs,0))


这正是第一个表达式…

您必须使用递归和咖喱来解决此问题:

def chained(functions):
    def g(x): #curry the functions
        result = x 
        for f in functions:
            result = f(result) 
        return result
    return g
给定“test.assert_equals(chained([f1,f2,f3])(0),4),结果将经过以下步骤 在第一次迭代中,x=0,所以结果=0。因此,迭代函数 结果=f1(0),然后结果=f2(f1(0)),然后结果=f3(f2(f1(0)))。然后返回结果
我们在“chained”函数中调用函数“g”,因为我们之前只在本地定义了它。

@AvinashRaj我已经更新了它。
chained
返回一个需要迭代的生成器。我的解决方案对于原始问题是正确的!UpdatedIt现在正在运行,但我无法理解您的解决方案,您能给我一些解释吗>?@BlackMamba添加了一些解释。
def retFunc(): return (lambda m: m*2)
def chained(fs):
    return (lambda m: reduce( lambda val, f: f(val) , fs, m))

print chained(fs)(0)
def chained(functions):
    def g(x): #curry the functions
        result = x 
        for f in functions:
            result = f(result) 
        return result
    return g