如何使用python实现`一元函数chainer`?

Bla*_*mba 3 python

我正在做代码战,我不能赢得这个挑战.这是链接:http: //www.codewars.com/kata/54ca3e777120b56cb6000710/train/python

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

def chained(functions):
    for f in functions:
        yield f

def f1(x): return x*2
def f2(x): return x+2
def f3(x): return x**2

def f4(x): return x.split()
def f5(xs): return [x[::-1].title() for x in xs]
def f6(xs): return "_".join(xs)

print chained([f1, f2, f3])(0)
Run Code Online (Sandbox Code Playgroud)

注意:reuslt chained([f1, f2, f3])(0)4!!!!!

以下是这些案例:

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 )
Run Code Online (Sandbox Code Playgroud)

Pet*_*ood 8

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

您的调用语法是:

chained([f1, f2, f3])(0)
Run Code Online (Sandbox Code Playgroud)

这意味着您想要chained使用单个参数返回可以调用的内容.功能会很好.

一个有效的功能是:

def apply(param):
    result = param
    for f in functions:
        result = f(result)
    return result
Run Code Online (Sandbox Code Playgroud)

这将使用前一个函数调用的结果调用每个函数.首先,使用初始参数.

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

def chained(functions):
    def apply(param):
        result = param
        for f in functions:
            result = f(result)
        return result
    return apply
Run Code Online (Sandbox Code Playgroud)

apply在本地定义函数会捕获functions参数.然后我们返回函数,以便可以调用它,基本上apply(0):

>>> chained([f1, f2, f3])(0)
4
Run Code Online (Sandbox Code Playgroud)