我正在尝试解决这个问题:
返回一个表示多项式的函数 系数。
例如,如果
coefs=(10, 20, 30)
,则返回计算的x
函数30 * x**2 + 20 * x + 10
。同时将coefs存储在.coefs
属性上.__name__
属性中的函数和公式的str。
这是我的解决方案:
def poly(coefs):
#write the string name
l=len(coefs)
coefs=reversed(coefs)
j=0
name=""
for i in coefs:
if j<l-2:
name=name+str(i)+" * x**"+str(l-j-1)+" + "
elif j==l-2:
name=name+str(i)+" * x + "
else:
name=name+str(i)
j=j+1
def calc(x):
name.replace("x",str(x))
calc.__name__=name
return eval(name)
return calc
效果不佳。
>>> p=poly((1,2,3))
>>> p
<function calc at 0x3b99938> #the name of p is not what I want!!! (*)
>>> y=p(3)
>>> p
<function 3 * x**2 + 2 * x + 1 at 0x3b99938> # now this is right!
>>>
如何在第一次通话中使用正确的名称(*)?
答案 0 :(得分:3)
设置功能对象的名称在之外:
def calc(x):
newname = name.replace("x", str(x))
calc.__name__ = newname
return eval(name)
calc.__name__ = name
return calc
请注意,str.replace()
不会替换字符串中的值。它返回改变的字符串,字符串值本身是不可变的。
您的初始名称必须使用x
,因为在您致电x
时未知poly()
的值。我会在名称中留下 out 填写x
;当您下次使用不同的x
调用该函数时,该函数将不会返回该精确计算。每次调用该函数时,不用替换名称中的x
,calc()
只会是:
def calc(x):
return eval(name)
在name = ''
功能的 top 处添加poly()
,并且每个呼叫的名称更改仍然存在,提供:
>>> p = poly((1,2,3))
>>> p
<function 3 * x**2 + 2 * x + 1 at 0x10ecf5488>
>>> p(3)
34
>>> p
<function 3 * 3**2 + 2 * 3 + 1 at 0x10ecf5488>