Python - 'function' 对象没有属性 'deflPoly'

Python - 'function' object has no attribute 'deflPoly'

尝试创建一个小脚本来测试名为 polyRoots 的脚本的不同部分。当我尝试使用 deflating poly 函数时,出现错误。这段代码并不复杂,我不确定为什么它不起作用。

import polyRoots as pr

print( "Deflation of polynomial: ")
print( pr.polyRoots.deflPoly( [20, -36, 7, 3], -5 ))

我收到以下错误:

File "C:temp.py", line 13, in <module>
print( pr.polyRoots.deflPoly( [20, -36, 7, 3], -5 ))

AttributeError: 'function' object has no attribute 'deflPoly'

polyRoots 脚本是一本从数值方法到工程的书籍代码资源。具体如下:

## module polyRoots
''' roots = polyRoots(a).
    Uses Laguerre's method to compute all the roots of
    a[0] + a[1]*x + a[2]*x^2 +...+ a[n]*x^n = 0.
    The roots are returned in the array 'roots',
'''    
from evalPoly import *
import numpy as np
import cmath
from random import random

def polyRoots(a,tol=1.0e-12):

    def laguerre(a,tol):
        x = random()   # Starting value (random number)
        n = len(a) - 1
        for i in range(30):
            p,dp,ddp = evalPoly(a,x)
            if abs(p) < tol: return x
            g = dp/p
            h = g*g - ddp/p
            f = cmath.sqrt((n - 1)*(n*h - g*g))
            if abs(g + f) > abs(g - f): dx = n/(g + f)
            else: dx = n/(g - f)
            x = x - dx
            if abs(dx) < tol: return x
        print('Too many iterations')

    def deflPoly(a,root):  # Deflates a polynomial
        n = len(a)-1
        b = [(0.0 + 0.0j)]*n
        b[n-1] = a[n]
        for i in range(n-2,-1,-1):
            b[i] = a[i+1] + root*b[i+1]
        return b

    n = len(a) - 1
    roots = np.zeros((n),dtype=complex)
    for i in range(n):
        x = laguerre(a,tol)
        if abs(x.imag) < tol: x = x.real
        roots[i] = x
        a = deflPoly(a,x)
    return roots

不确定是什么导致了这个错误,因为它实际上只是每个通缩请求的一行代码。请指教。

正如错误信息所说,polyRoots是一个函数; deflPoly是在里面定义的函数,但不是它的属性。

我觉得他不能在函数外调用函数deflPoly。因为它属于 local 范围。

例如:

def a():
    print 'a function'
    def b():
        print 'b function'

a().b()

这应该是错误的,因为函数 a() returns None,即使是函数 a() returns 的一些值,它也没有属性 b.

为了使用函数 b(),我们必须设置一个 link 到内部函数,例如

def a():
    print 'a function'
    def b():
        print 'b function'
    return b

test = a()
test()

>>>a function
>>>b function