2015-02-25 5 views
1

Попробовал создать небольшой скрипт, чтобы протестировать различные части скрипта polyRoots. Когда я попытался использовать функцию deflating poly, я получаю сообщение об ошибке. У них нет ничего сложного в этом коде, и я не уверен, почему он не работает.Python - объект 'function' не имеет атрибута 'deflPoly'

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 

Неопределенный, что вызывает эту ошибку, как это на самом деле только одна строка кода для каждого запроса дефляции. Пожалуйста, порекомендуйте.

+0

Элементы обоих текущих ответов являются правильными и актуальными. Имена, определенные внутри функции, являются локальными для этой функции и не отображаются вне этой функции. Кажется, вы объединяете функции и классы Python (или, возможно, функции и модули). Я не думаю, что вы получите гораздо больше подробностей или объяснений, чем это у пользователей Stack Overflow (не потому, что они не хотят помогать, а потому, что ответ на этот тип вопроса, похоже, учит вас основам Python); попробуйте прочитать [tutorial] (https://docs.python.org/2/tutorial/). –

ответ

0

Я думаю, что он не может вызывать функцию deflPoly вне функции. Потому что он имеет размер local.

Для экс:

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

a().b() 

Это должно быть ошибка, потому что функция a() возвращает None, если даже некоторое значение для функции a() возвращается, он не имеет атрибута b.

заказовМои использовать функцию b(), мы должны настроить link к внутренней функции s как

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

test = a() 
test() 

>>>a function 
>>>b function 
0

Как говорится в сообщении об ошибке, polyRoots - это функция; deflPoly - это функция, определенная внутри нее, но она не является ее атрибутом.