函数是任意许多其他函数的总和
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
函数接受一个序列作为唯一的参数,其元素需要是int
或float
。 第一个元素被指定为x ^ 0的系数,第二个元素被指定为x ^ 1等等。 所以你的例子(p(x)= x + x ^ 2)最终会像这样构造: p = poly([0, 1, 1])
另一种选择是接受任何数量的参数,其中每个参数都需要是int
或float
而不是第一个是序列。 这只需要在函数声明中添加一个*
即可。
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)
将返回2
, p(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