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

2024-06-17 11:27:10 发布

您现在位置: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)

注意:重用chained([f1, f2, f3])(0)4!!!!!在

以下是tese案例:

^{pr2}$

Tags: inhttp密码forreturn链接defwww
3条回答

您可以使用reduce。。。在

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

fs = [f1, f2, f3] 
print reduce( lambda val, f: f(val) , fs, 0 )

您需要的是一个函数chained,它返回另一个接受一个变量的函数。一个接受一个变量(比如m)的示例函数是lambda m: m*2。在

现在一个函数返回另一个接受一个值的函数?在

^{pr2}$

所以我们把以上两种想法结合起来。。。在

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和{}所有函数的函数。在

所以,chained(fs)(0)

变成(lambda m: reduce( lambda val, f: f(val) , fs, m))(0)

变成(reduce( lambda val, f: f(val) , fs, 0))

这正是第一个表达。。。在

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

print chained([f1, f2, f3])(0)

尝试:

^{pr2}$

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

您的调用语法是:

chained([f1, f2, f3])(0)

这意味着您希望chained返回可以用单个参数调用的内容。一个函数就可以了。在

有效的功能是:

^{pr2}$

这将使用上一次函数调用的结果调用每个函数。首先使用初始参数。在

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

def chained(functions):
    def apply(param):
        result = param
        for f in functions:
            result = f(result)
        return result
    return apply

定义函数apply本地捕获functions参数。然后我们返回函数,这样就可以调用它,本质上是apply(0)

>>> chained([f1, f2, f3])(0)
4

相关问题 更多 >