以编程方式从其他函数列表中定义新函数

时间:2016-08-05 12:43:16

标签: python python-3.x functional-programming

我有:

def f(x, y): return x**2 + y**2
def g(x, y): return x**3 + y**3
def h(x, y): return x**4 + y**4

我想创建一个新功能:

def J(x, y):
    return f(x,y)*g(x,y)*h(x,y)

但是,我无法找到以编程方式执行此操作的方法。 就是这样:

myFunctions = [f,g,h]

并返回一个新功能J,该功能会返回fgh的产品。

另一个问题是,虽然fgh将始终具有相同数量的参数,但该数字可能会发生变化。也就是说,他们都可能有五个参数而不是两个。

期望的行为:

print(J(2, 2)) # 4096

修改

myFunctions中的函数数量也是任意的。 我认为这是在我的问题中隐含的,但在重新阅读之后,我发现我根本没有明白这一点。道歉。

4 个答案:

答案 0 :(得分:3)

您可以允许J根据需要使用尽可能多的参数,然后乘以f,g和h给出的最终列表:

def f(x, y): return x**2 + y**2

def g(x, y): return x**3 + y**3

def h(x, y): return x**4 + y**4

def multiply(mylist):
    return reduce(lambda a, b: a*b, mylist)

myfuncs = [f,g,h]
def J(*args):
    return multiply([myfunc(*args) for myfunc in myfuncs])

由于f,g和h将具有相同数量的参数,因此这适用于所有情况。

答案 1 :(得分:3)

一个函数可以使用*接受任意多个参数,如下所示:

def J(*args):

这会将所有J个参数存储在列表args中。然后可以将该列表转换回多个参数以调用其他函数,如下所示:

def J(*args):
  return f(*args) * g(*args)

这解决了参数数量变化的问题。所以现在让我们来处理可以有任意多个功能的事实。首先,我们需要在列表中调用该函数。我们可以通过迭代它们并使用()

来做到这一点
def J(*args):
  return [func(*args) for func in myFunctions]

这将返回功能列表'返回值。所以我们现在需要的是获得一个集合的产品:

from functools import reduce
from operator import mul

def product(numbers):
  return reduce(mul, list, 1)

def J(*args):
  return product(func(*args) for func in myFunctions)

答案 2 :(得分:1)

另一种选择:

from functools import reduce, partial
from operator import mul

def f(x, y): return x**2 + y**2
def g(x, y): return x**3 + y**3
def h(x, y): return x**4 + y**4

myFunctions = [f,g,h]

J = partial(lambda funcs, *args: reduce(mul, (func(*args) for func in funcs), 1), myFunctions)
print J(2, 2)

J具有与函数f,g和amp相同数量的参数的良好属性。 h而不是*args

答案 3 :(得分:0)

可以解决变量数量的参数问题:

def f(*args): return sum(map(lambda x: x**2, args))

def g(*args): return sum(map(lambda x: x**3, args))

def h(*args): return sum(map(lambda x: x**4, args))

然后你可以简单地定义J函数

def J(*args):
    return f(*args)*g(*args)*h(*args)

如果要支持可变数量的函数,则可以将J定义为以下内容,并将函数列表作为列表的第一项和参数传递为以下项。

def J(*args):
    funcs = args[0]            
    args = args[1:]           
    temp = map(lambda x: x(*args), funcs)
    return reduce(lambda x,y: x*y, temp, 1)