我有:
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
,该功能会返回f
,g
和h
的产品。
另一个问题是,虽然f
,g
和h
将始终具有相同数量的参数,但该数字可能会发生变化。也就是说,他们都可能有五个参数而不是两个。
期望的行为:
print(J(2, 2)) # 4096
myFunctions
中的函数数量也是任意的。
我认为这是在我的问题中隐含的,但在重新阅读之后,我发现我根本没有明白这一点。道歉。
答案 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)