我正在做代码战,我不能赢得这个挑战.这是链接: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)
您需要返回一个函数,而不是返回一个生成器,该函数接受一个参数并将其应用于每个链接函数.
您的调用语法是:
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)
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |