我在python练习中遇到问题,我必须创建一个基于列表的函数,该函数将给我一个特定的多项式方程式,例如,如果给定[1,2,3]
生成x^2 + 2x + 3
且给定[2,2]
生成2x + 2
。我的想法是制作一个可一次更改lambda 1项的函数,如下所示,但我无法使其工作。有什么建议吗?
def polynomial(coefs):
cofLen = len(coefs)
ff = lambda x: 0
while cofLen > 0:
ff += coefs[0]*( x**cofLen)
del coefs[0]
return ff
polynomial([1,2,3])
我得到的错误是:NameError: global name 'x' is not defined
。
将其更改为
x = 0
def polynomial(coefs):
global x
cofLen = len(coefs)
ff = lambda x: 0
while cofLen > 0:
ff += coefs[0]*( x**cofLen)
del coefs[0]
return ff
将错误更改为TypeError: unsupported operand type(s) for +=: 'function' and 'int'
。
答案 0 :(得分:0)
您不能像这样扩展lambda。您在lambda中使用的变量仅存在于其中-这就是为什么您会遇到第一个错误(NameError: global name 'x' is not defined.
上的x**cofLen)
)的原因。如果提供全局x,则仍然无法使用,因为您无法将整数添加到lambda。
您可以使用系数的倒排列表,并enumerate()来获取解决方案,而不是逐步构建lambda。枚举为您提供了进入列表的索引,该索引转换为您需要的x的“幂”。组成函数并计算其中一个x
的解决方案:
def pol(coeff,x):
"""Calculates the resulting tuple for a polynomial given as coeff list
anc calculates it at one point of x.
coeff is a list - most significant exponent first: [1,2,3] == x^2+2x+3 """
# create a textual representation
t = []
for idx,c in enumerate(coeff[::-1]):
if c != 0:
if idx == 0:
t.append(f"{c}")
else:
t.insert(0,f"{f'{c}*' if c != 1 else ''}x{'' if idx==1 else f'^{idx}'}")
# connect text-parts with '+' and fix '+-' to '-'
text = '+'.join(t).replace("+-","-")
# calculate the functions value
result = sum( x**idx*v for idx,v in enumerate(coeff[::-1]))
return text + f" (@ x={x}) ",result
for i in range(10):
print(*pol([3,1,-4,1,0,-10],i), sep=" ==> ")
输出:
3*x^5+x^4-4*x^3+x^2-10 (@ x=0) ==> -10
3*x^5+x^4-4*x^3+x^2-10 (@ x=1) ==> -9
3*x^5+x^4-4*x^3+x^2-10 (@ x=2) ==> 74
3*x^5+x^4-4*x^3+x^2-10 (@ x=3) ==> 701
3*x^5+x^4-4*x^3+x^2-10 (@ x=4) ==> 3078
3*x^5+x^4-4*x^3+x^2-10 (@ x=5) ==> 9515
3*x^5+x^4-4*x^3+x^2-10 (@ x=6) ==> 23786
3*x^5+x^4-4*x^3+x^2-10 (@ x=7) ==> 51489
3*x^5+x^4-4*x^3+x^2-10 (@ x=8) ==> 100406
3*x^5+x^4-4*x^3+x^2-10 (@ x=9) ==> 180863
反向枚举如何工作?
enumerate ([3, 1, -4, 1, 0, -10][::-1]) gives us:
# values -10 0 1 -4 1 3 -> v
# indexes 0 1 2 3 4 5 -> idx
然后sum( x**idx*v for idx,v in enumerate(coeff[::-1]))
编辑。
x==5
的示例:
c idx v
5 ** 0 * -10 = -10
5 ** 1 * 0 = 0
5 ** 2 * 1 = 25
5 ** 3 * -4 = -500
5 ** 4 * 1 = 625
5 ** 5 * 3 = 9375 Total sum = 9515