如何在 Python 中打包按顺序作用于参数的序列函数
How to package a sequence functions that act on parameter in order in Python
假设有三个函数,它们都接受和return相同类型的参数。
通常我们可以写成fun3(fun2(fun1(args))
,这可以说是一个序列函数按顺序作用于参数,就像一种高阶函数“map”。
你知道在 Mathematica 中,我们可以将其写为 fun3@fun2@fun1@args
。
现在的问题是,我们是否可以在不修改fun3@fun2@fun1的定义的情况下,将其整合为另一种fun,这样fun(args)
就可以替代fun3(fun2(fun1(args))
,这样看起来更优雅简洁。
我想你可以在 python 中使用函数递归来做到这一点。
def function(args, times):
print(f"{times} Times - {args}")
if times > 0 :
function(args,times - 1)
function("test", 2)
注意:我只是添加了 times 参数以不生成无限循环。
我不确定我理解你的问题,但你是在按照这些思路谈论函数组合吗?
# Some single-argument functions to experiment with.
def double(x):
return 2 * x
def reciprocal(x):
return 1 / x
# Returns a new function that will execute multiple single-argument functions in order.
def compose(*funcs):
def g(x):
for f in funcs:
x = f(x)
return x
return g
# Demo.
double_recip_abs = compose(double, reciprocal, abs)
print(double_recip_abs(-2)) # 0.25
print(double_recip_abs(.1)) # 5.0
def merge_steps(*fun_list):
def fun(arg):
result = arg
for f in fun_list:
result = f(result)
return result
return fun
def plus_one(arg):
return arg + 1
def double_it(arg):
return arg ** 2
def power_ten(arg):
return arg ** 10
combine1 = merge_steps(power_ten, plus_one, double_it)
combine2 = merge_steps(plus_one, power_ten, double_it)
combine1(3)
> 3486902500
或使用 lambda:
steps = [power_ten, plus_one, double_it]
reduce(lambda a, f: f(a), steps, 3)
> 3486902500
假设有三个函数,它们都接受和return相同类型的参数。
通常我们可以写成fun3(fun2(fun1(args))
,这可以说是一个序列函数按顺序作用于参数,就像一种高阶函数“map”。
你知道在 Mathematica 中,我们可以将其写为 fun3@fun2@fun1@args
。
现在的问题是,我们是否可以在不修改fun3@fun2@fun1的定义的情况下,将其整合为另一种fun,这样fun(args)
就可以替代fun3(fun2(fun1(args))
,这样看起来更优雅简洁。
我想你可以在 python 中使用函数递归来做到这一点。
def function(args, times):
print(f"{times} Times - {args}")
if times > 0 :
function(args,times - 1)
function("test", 2)
注意:我只是添加了 times 参数以不生成无限循环。
我不确定我理解你的问题,但你是在按照这些思路谈论函数组合吗?
# Some single-argument functions to experiment with.
def double(x):
return 2 * x
def reciprocal(x):
return 1 / x
# Returns a new function that will execute multiple single-argument functions in order.
def compose(*funcs):
def g(x):
for f in funcs:
x = f(x)
return x
return g
# Demo.
double_recip_abs = compose(double, reciprocal, abs)
print(double_recip_abs(-2)) # 0.25
print(double_recip_abs(.1)) # 5.0
def merge_steps(*fun_list):
def fun(arg):
result = arg
for f in fun_list:
result = f(result)
return result
return fun
def plus_one(arg):
return arg + 1
def double_it(arg):
return arg ** 2
def power_ten(arg):
return arg ** 10
combine1 = merge_steps(power_ten, plus_one, double_it)
combine2 = merge_steps(plus_one, power_ten, double_it)
combine1(3)
> 3486902500
或使用 lambda:
steps = [power_ten, plus_one, double_it]
reduce(lambda a, f: f(a), steps, 3)
> 3486902500