在Python中定义函数的乘法?

Leo*_*eon 3 python haskell functional-programming

我试图在Python中定义函数乘法,在伪代码中这是:

这应该在x中返回一个函数,给定f(x),g(x)

multiply_two_functions((f(x), g(x)) = f(x) * g(x)
Run Code Online (Sandbox Code Playgroud)

我可以在Haskell中这样做:

mult :: (Num b) => (a -> b) -> (a -> b) -> (a -> b)  
mult f g = h
    where h x = (f x) * (g x)
Run Code Online (Sandbox Code Playgroud)

你可能会问我为什么要这样做 - 我有一个函数列表[f],我想用乘法来减少它们.再次,在Haskell:

reduce_mult list = foldl mult 1 list
Run Code Online (Sandbox Code Playgroud)

编辑:我如何在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
Run Code Online (Sandbox Code Playgroud)

有没有人有Python实现的任何提示?

Bre*_*arn 6

只需编写一个返回新函数的函数,该函数返回其他函数结果的乘积:

def multiply_funcs(f, g):
    def multiplied(x):
        return f(x) * g(x)
    return multiplied
Run Code Online (Sandbox Code Playgroud)


jon*_*rpe 6

如果您正在询问如何实现一个函数来创建一个将结果与目标函数相乘的新函数,它将类似于:

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
Run Code Online (Sandbox Code Playgroud)

注意*args, **kwargs用于处理任何位置和关键字参数(参见例如**(双星)和*(星)对参数做什么?); 唯一的限制是任何一对,f并且g必须能够处理将传递给的相同参数h.正在使用:

>>> def f(x):
    return x + 1

>>> def g(x):
    return 2 * x

>>> h = multiply_two_functions(f, g)
>>> h(5)
60
Run Code Online (Sandbox Code Playgroud)

如果你想实际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)
Run Code Online (Sandbox Code Playgroud)

这可以使用如下:

>>> f = Func(lambda x: x + 1)
>>> g = Func(lambda x: 2 * x)
>>> h = f * g
>>> h(5)
60
Run Code Online (Sandbox Code Playgroud)


Car*_*ten 5

你可以在Python中做几乎相同的事情:返回一个将两个函数相乘的lambda.

def multiply_two_functions(f, g):
    return lambda x: f(x) * g(x)
Run Code Online (Sandbox Code Playgroud)

测试:

def a(x):
    return 2 * x

aa = multiply_two_functions(a, a)
print(aa(0), aa(1), aa(2))
Run Code Online (Sandbox Code Playgroud)

输出:

(0, 4, 16)
Run Code Online (Sandbox Code Playgroud)