以编程方式创建函数

Creating a function programmatically

关于这个主题有很多有趣的帖子,但我似乎要么不理解他们的答案,要么瞄准不同的东西。这就是我想要做的。我有两个(或更多)函数想要组合成一个新函数。以下代码段显示了我开始的内容以及我希望结束的内容。

def a(x):
    0.2 * x[1] - 0.4 * x[0]

def b(x):
    0.4 * x[0] - 0.2 * x[1]

def ab(x):
    return [0.2 * x[1] - 0.4 * x[0], 0.4 * x[0] - 0.2 * x[1]]

问题是,我想在 运行 时间动态创建 ab。 我有一个包含所有函数的列表 ml,所以我可以在新函数

中执行以下操作
def abl(x):
    ml = [a, b]
    rl = []
    i = 0
    for f in ml:
        rl.append(f(x[i]))
        i = i + 1 

然后调用abl。此代码组合了各个函数并产生了预期的输出结果。但是,每次调用 abl rl 都必须重新构建,这看起来很浪费。

是否有另一种组合 ab 以创建新函数的方法 ab

您可以通过 lambda expressions:

动态 return 新功能
def a(x):
    return 0.2 * x[1] - 0.4 * x[0]

def b(x):
    return 0.4 * x[0] - 0.2 * x[1]

def combine(func1, func2):
    return lambda x: [func1(x), func2(x)]
    
ab = combine(a, b)
print(ab([1.3, 2.9]))

输出:

[0.05999999999999994, -0.05999999999999994]

您可以扩展 lambda approach to any number of functions using *args:

def a(x):
    return 0.2 * x[1] - 0.4 * x[0]

def b(x):
    return 0.4 * x[0] - 0.2 * x[1]

def c(x):
    return 0.5 * x[0]

def d(x):
    return 0.5 * x[1]

def combine(*args):
    return lambda x: [f(x) for f in args]

abcd = combine(a, b, c, d)
print(abcd([1.3, 2.9]))

给予

[0.05999999999999994, -0.05999999999999994, 0.65, 1.45]