【问题标题】:Creating a function programmatically以编程方式创建函数
【发布时间】:2022-01-10 01:16:26
【问题描述】:

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

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

【问题讨论】:

  • 我没听懂。 ab(x) 有什么问题?
  • 您为abl 发布的代码似乎不完整。请提供一个完整的、可重现的示例。
  • 您不需要i。更多 pythonic 来做for f, xi in zip(ml, x) 并使用xi 而不是x[i]。实际上你根本不需要这个,因为你想将整个x 传递给a()b() 函数。就做for f in ml: rl.append(f(x))
  • 另外,无论如何,每次调用ab() 时,您都会创建一个新的rl - 以您在abl() 中的方式创建它与您在@ 中的方式创建它没有什么不同987654346@

标签: python function combinations programmatically-created


【解决方案1】:

您可以通过lambda expressions动态返回新函数:

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]

【讨论】:

    【解决方案2】:

    您可以使用*args@Random Davis's lambda 方法扩展到任意数量的函数:

    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]
    

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2013-07-25
      相关资源
      最近更新 更多