lnNoam lnNoam - 4 months ago 7
Python Question

Programmatically define a new function from a list of other functions

I have:

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


And I'd like to make a new function:

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


However, I am unable to find a way to do this programmatically.
That is, take something like:

myFunctions = [f,g,h]


and return a new function
J
which returns the product of
f
,
g
and
h
.

Another wrinkle is that while
f
,
g
and
h
will always have an identical number of arguments, that number could change. That is, they could all have could have five arguments instead of two.

Desired behaviour:

print(J(2, 2)) # 4096





EDIT



The number of functions in
myFunctions
is also arbitrary.
I thought this was implied in my question, but upon rereading it I see that I did not make that at all clear. My apologies.

Answer

A function can accept arbitrarily many arguments using * like this:

def J(*args):

This will store all of J's arguments in the list args. That list can then be converted back into multiple arguments to call other functions like this:

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

This solves the problem of the number of arguments changing. So now let's handle the fact that there can be arbitrarily many functions. First we need to call the function in your list. We can just do that by iterating over them and using ():

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

This will return a list of the functions' return values. So all we need now is to get the product of a collection:

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)