在 Python 中定义函数乘法?
Defining multiplication over functions in Python?
我试图在 Python 中定义函数乘法,在伪代码中是:
这应该 return 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 f g = h
where h x = (f x) * (g x)
您可能会问我为什么要这样做 - 我有一个函数列表 [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 实施有什么建议吗?
您可以在 Python 中做几乎相同的事情:return 将两个函数相乘的 lambda。
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)
只需编写一个函数 returns 一个新函数 returns 其他函数结果的乘积:
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 e.g. h(x) == f(x) * g(x)."""
def h(*args, **kwargs):
return f(*args, **kwargs) * g(*args, **kwargs)
return h
注意使用 *args, **kwargs
来处理任何位置和关键字参数(参见 What does ** (double star) and * (star) do for parameters?);唯一的限制是任何对 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
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 中定义函数乘法,在伪代码中是:
这应该 return 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 f g = h
where h x = (f x) * (g x)
您可能会问我为什么要这样做 - 我有一个函数列表 [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 实施有什么建议吗?
您可以在 Python 中做几乎相同的事情:return 将两个函数相乘的 lambda。
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)
只需编写一个函数 returns 一个新函数 returns 其他函数结果的乘积:
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 e.g. h(x) == f(x) * g(x)."""
def h(*args, **kwargs):
return f(*args, **kwargs) * g(*args, **kwargs)
return h
注意使用 *args, **kwargs
来处理任何位置和关键字参数(参见 What does ** (double star) and * (star) do for parameters?);唯一的限制是任何对 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