2

我正在尝试解决这个练习:

返回一个函数,该函数表示具有这些系数的多项式。

例如,如果coefs=(10, 20, 30),返回x计算 的函数30 * x**2 + 20 * x + 10。还将 coefs 存储在.coefs函数的属性上,并将公式的 str 存储在.__name__属性上。

这是我的解决方案:

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!
>>> 

我怎样才能在第一次通话中也有正确的名字 (*) ?

4

1 回答 1

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()。但是,我会省略填写x名称;下次您使用不同的x. 无需x在每次调用函数时都替换名称,calc()只需:

def calc(x):
    return eval(name)

连同在函数顶部添加name = ''每次调用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>
于 2013-09-20T08:52:05.907 回答