如何在 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