Определение умножения на функции в Python?

Я пытаюсь определить умножение на функции в Python, в псевдокоде это:

Это должно возвращать функцию по x, заданную f (x), g (x)

multiply_two_functions((f(x), g(x)) = f(x) * g(x) 

Я могу сделать это в Haskell так:

 mult :: (Num b) => (a -> b) -> (a -> b) -> (a -> b) mult fg = h where hx = (fx) * (gx) 

Вы можете спросить, почему я хочу это сделать – у меня есть список функций [f], и я хочу уменьшить их с помощью умножения. Опять же, в Haskell:

 reduce_mult list = foldl mult 1 list 

Изменить: как я использую его в python, для полноты:

 def prod_reduce(f_list): def identity(x): return 1 def f_mult(f, g): def multiplied(x): return f(x) * g(x) return multiplied prod = identity for f in f_list: prod = f_mult(prod, f) return prod 

Есть ли у кого-нибудь советы по реализации Python?

Просто напишите функцию, которая возвращает новую функцию, которая возвращает произведение результатов других функций:

 def multiply_funcs(f, g): def multiplied(x): return f(x) * g(x) return multiplied 

Если вы спросите, как реализовать функцию для создания новой функции, которая умножает результаты на целевые функции, она будет выглядеть примерно так:

 def multiply_two_functions(f, g): """Return a new function for eg h(x) == f(x) * g(x).""" def h(*args, **kwargs): return f(*args, **kwargs) * g(*args, **kwargs) return h 

Обратите внимание на использование *args, **kwargs для обработки любых аргументов positional и keyword (см. Например, что делает ** (двойная звезда) и * (звезда) для параметров? ); единственным ограничением является то, что любая пара f и g должна иметь возможность обрабатывать те же аргументы, которые будут переданы h . В использовании:

 >>> def f(x): return x + 1 >>> def g(x): return 2 * x >>> h = multiply_two_functions(f, g) >>> h(5) 60 

Если вы хотите, чтобы h = f * g работал, вам нужно было бы реализовать класс с __call__ и __mul__ :

 class Func(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): return self.func(*args, **kwargs) def __mul__(self, other): def new_func(*args, **kwargs): return self(*args, **kwargs) * other(*args, **kwargs) return Func(new_func) 

Это можно использовать следующим образом:

 >>> f = Func(lambda x: x + 1) >>> g = Func(lambda x: 2 * x) >>> h = f * g >>> h(5) 60 

Вы можете сделать почти то же самое в Python: вернуть лямбду, которая умножает две функции.

 def multiply_two_functions(f, g): return lambda x: f(x) * g(x) 

Контрольная работа:

 def a(x): return 2 * x aa = multiply_two_functions(a, a) print(aa(0), aa(1), aa(2)) 

Вывод:

 (0, 4, 16) 
Interesting Posts