如何将函数列表组合成可调用对象
How to compose a list of functions to a callable
我有一个简单的来源。
def h(x):
return x + 1
def m(x):
return x + 2
def n(x):
return x * 10
def function_aggregator(fun_list, num):
return_fun = None
for fun in fun_list[::-1]:
if return_fun:
return_fun = fun(return_fun)
else:
return_fun = fun(num)
return return_fun
if __name__ == "__main__":
lst = [h, m, n]
y = function_aggregator(lst, 4)
print(y)
有什么方法可以让 function_aggregator
方法只接收列表和 return 一个可调用对象,这将与 h(m(n(<any_number>))
相同
可以使用闭包来完成:
def function_aggregator(*func_list):
def aggregate(num):
for func in reversed(func_list):
num = func(num)
return num
return aggregate
if __name__ == "__main__":
myfunc = function_aggregator(h, m, n)
print(myfunc(4))
备注
function_aggregator
现在接受任意数量的函数
- 里面定义了另一个函数,
aggregate
,就是你说的callable
function_aggregator
return 是 可调用的 ,又名 aggregate
给调用者
- 然后调用者给它起一个名字,
myfunc
在这个例子中
- 从那时起,我们可以将
myfunc
视为一个接受 1 个参数和 return 某些参数的函数
前面的答案很接近。确切答案是:
def function_aggregator(fun_list):
def wrapper(arg):
for fun in reversed(fun_list):
arg = fun(arg)
return arg
return wrapper
if __name__ == "__main__":
lst = [g, f, n, m, h]
p = function_aggregator(lst)
x = 3
print("p(x): {}".format(p(x)))
感谢Zero Piraeus commet
我有一个简单的来源。
def h(x):
return x + 1
def m(x):
return x + 2
def n(x):
return x * 10
def function_aggregator(fun_list, num):
return_fun = None
for fun in fun_list[::-1]:
if return_fun:
return_fun = fun(return_fun)
else:
return_fun = fun(num)
return return_fun
if __name__ == "__main__":
lst = [h, m, n]
y = function_aggregator(lst, 4)
print(y)
有什么方法可以让 function_aggregator
方法只接收列表和 return 一个可调用对象,这将与 h(m(n(<any_number>))
可以使用闭包来完成:
def function_aggregator(*func_list):
def aggregate(num):
for func in reversed(func_list):
num = func(num)
return num
return aggregate
if __name__ == "__main__":
myfunc = function_aggregator(h, m, n)
print(myfunc(4))
备注
function_aggregator
现在接受任意数量的函数- 里面定义了另一个函数,
aggregate
,就是你说的callable function_aggregator
return 是 可调用的 ,又名aggregate
给调用者- 然后调用者给它起一个名字,
myfunc
在这个例子中 - 从那时起,我们可以将
myfunc
视为一个接受 1 个参数和 return 某些参数的函数
前面的答案很接近。确切答案是:
def function_aggregator(fun_list):
def wrapper(arg):
for fun in reversed(fun_list):
arg = fun(arg)
return arg
return wrapper
if __name__ == "__main__":
lst = [g, f, n, m, h]
p = function_aggregator(lst)
x = 3
print("p(x): {}".format(p(x)))
感谢Zero Piraeus commet