函数是任意许多其他函数的总和

HEJ! 我试图用Python编写一个函数,用于多项式p,它是n个基函数phi_i的线性组合。 我怎样才能定义一个函数本身是其他n个函数的总和?

我知道这是有效的:

phi1 = lambda x: x**2
phi2 = lambda x: x
p = lambda x: phi1(x) + phi2(x)

但是,如果我尝试这样的循环:

p = lambda x: 0
for i in range(0,n):
    p = lambda x: p(x)+phi[i](x)

其中phi是我的基础函数列表,我创建了一个无限循环。


我检查了编写一个函数的总和函数,但不幸的是这不是Python。


你可以通过一个简单的生成器表达式来做到这一点sum

def sigma(funcs, x):
    return sum(f(x) for f in funcs)

phi = [lambda x: x**2, lambda x: x]
y = sigma(phi, x)

顺便说一句,使用lambda命名函数被认为是不好的风格,它应该是匿名函数。


如果你想要一个不需要phi的函数在你每次调用它时都会被传递,那么有几种方法可以做到这一点。 最简单的方法是在函数中简单使用phi 。 例如,

def sigma(x):
    return sum(f(x) for f in phi)

但是,这有几个缺点。 如果phi不在你称之为sigma的范围内,它将不起作用; 你可以通过使phi成为全局来解决这个问题,但这可能不方便,最好避免在不需要的情况下使用全局变量。 另一个缺点是,它使用phi的当前内容,而不是它在定义sigma时所具有的内容,所以如果修改phi的内容,这些更改将反映在sigma ,这可能会或可能不需要。

另一种选择是使用闭包创建函数。 然后我们不会受范围问题的影响:您可以在原始函数列表不可见的范围内调用结果求和函数。 我们也可以创建函数列表的一个副本,所以它不会受到传入函数列表更改的影响。

def make_adder(funcs):
    # Copy the function list 
    funcs = funcs[:]
    def sigma(x):
        return sum(f(x) for f in funcs)
    return sigma

phi = [lambda x: x**2, lambda x: x]
sigma = make_adder(phi)
y = sigma(x)

还有一种选择是使用我的原始sigma ,并将它和phi函数传递给functools.partial ,例如

from functools import partial
sig = partial(sigma, phi)
y = sig(x)

OP的直接答案

将您的phis存储在list

phis = [
    lambda x: x**2,
    lambda x: x,
]
p = lambda x: sum(phi(x) for phi in phis)

进一步考虑

如果你想实现一个多项式,我会建议类似这样的事情:

def poly(c):
    return lambda x: sum(f(x) for f in [lambda x, i=i: c[i]*x**i for i in range(len(c))])

poly函数接受一个序列作为唯一的参数,其元素需要是intfloat 。 第一个元素被指定为x ^ 0的系数,第二个元素被指定为x ^ 1等等。 所以你的例子(p(x)= x + x ^ 2)最终会像这样构造: p = poly([0, 1, 1])

另一种选择是接受任何数量的参数,其中每个参数都需要是intfloat而不是第一个是序列。 这只需要在函数声明中添加一个*即可。

def poly(*c):
    return lambda x: sum(f(x) for f in [lambda x, i=i: c[i]*x**i for i in range(len(c))])

用这个函数构造你的例子,你不需要列表: p = poly(0, 1, 1)

任何这些方法都会创建一个多项式函数,可以按照您的预期调用: p(1)将返回2p(2)将返回6 ,依此类推。

功能解释

def poly(c):
    # Create a list where we are gonna store the functions for every term in the polynomial
    terms = []
    # Create as many terms as the arguments length
    for i in range(len(c)):
        # Each term is the product of the nth coefficient from c and x to the power of n
        terms.append(lambda x, n=i: c[n]*x**n)
        # The second parameter n is needed because if we pass i directly
        # inside the function algorithm, Python wouldn't check its value
        # inmediately, but when it gets executed, and by then the loop will
        # be finished and i would be constant for every term. This argument
        # is not exposed to the polynomial function as the next lambda only
        # has one argument, so there is no way to wrongly call this function
    # We return a function that adds the result of every term
    return lambda x: sum(f(x) for f in terms)
链接地址: http://www.djcxy.com/p/51119.html

上一篇: function that is sum of arbitrary many other functions

下一篇: Python ftplib: Show FTP upload progress