2015-08-22 5 views
2

Я программирую небольшой модуль Python с Python 2.7.6 (по умолчанию, 22 июня 2015 г., 17:58:13), и я использую IPython 1.2.1 для запуска моей программы.NameError: имя функции не определено

Этот модуль будет содержать несколько математических функций с степенными рядами. Я отделяю определения функций python от тестов функции python.

Вот мой код PowerSeries.py:

### Computations of some functions by power series ### 

def exp(x): 
    """Exponential function""" 
    exp=1.0 
    term=1.0 
    iteration=1 
    factorial=1 
    while(abs(term/factorial)>1e-10): 
     factorial*=iteration 
     term*=x 
     exp+=term/factorial 
     iteration+=1 
    return exp 

def hyperbolicCosine(x): 
    """Hyperbolic cosine function""" 
    cosh=1.0 
    term=1.0 
    iteration=1 
    factorial=1 
    while(abs(term/factorial)>1e-10): 
     factorial*=iteration 
     term*=x 
     if iteration%2==0: 
      cosh+=term/factorial 
     iteration+=1 
    return cosh 

def sine(x): 
    """Sine function""" 
    sine=0.0 
    term=1.0 
    iteration=1 
    factorial=1 
    while(abs(term/factorial)>1e-10): 
     factorial*=iteration 
     term*=x 
     if iteration%2==1: 
      sine+=term/factorial     
      term=-term 
     iteration+=1 
    return sine 

def cosine(x): 
    """Cosine function""" 
    cosine=1.0 
    term=1.0 
    iteration=1 
    factorial=1 
    while(abs(term/factorial)>1e-10): 
     factorial*=iteration 
     term*=x 
     if (iteration)%2==0: 
      term=-term 
      cosine+=term/factorial    
     iteration+=1 
    return cosine 

Вот мой код tests.py:

### Tests for PowerSeries Module ### 
from math import pi 
from PowerSeries import * 

# Tests of exponential 
print "### Tests of exponential ###" 
x=-2 
print("x=%f exp(x)=%.10f" % (x,exp(x))) 
x=-1 
print("x=%f exp(x)=%.10f" % (x,exp(x))) 
x=0 
print("x=%f exp(x)=%.10f" % (x,exp(x))) 
x=1 
print("x=%f exp(x)=%.10f" % (x,exp(x))) 
x=2 
print("x=%f exp(x)=%.10f" % (x,exp(x))) 

# Tests of hyperbolic cosine 
print "### Tests of hyperbolic cosine ###" 
x=-2 
print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 
x=-1 
print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 
x=0 
print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 
x=1 
print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 
x=2 
print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 


# Tests of sine 
print "### Tests of sine ###" 
x=0 
print("x=%f sin(x)=%.10f" % (x,sine(x))) 
x=pi/6 
print("x=%f sin(x)=%.10f" % (x,sine(x))) 
x=pi/4 
print("x=%f sin(x)=%.10f" % (x,sine(x))) 
x=pi/3 
print("x=%f sin(x)=%.10f" % (x,sine(x))) 
x=pi/2 
print("x=%f sin(x)=%.10f" % (x,sine(x))) 

# Tests of cosine 
print "### Tests of cosine ###" 
x=0 
print("x=%f cos(x)=%.10f" % (x,cosine(x))) 
x=pi/6 
print("x=%f cos(x)=%.10f" % (x,cosine(x))) 
x=pi/4 
print("x=%f cos(x)=%.10f" % (x,cosine(x))) 
x=pi/3 
print("x=%f cos(x)=%.10f" % (x,cosine(x))) 
x=pi/2 
print("x=%f cos(x)=%.10f" % (x,cosine(x))) 

Все работает отлично, пока я не добавить определение hyperbolicCosine. Выполнение tests.py файла дает NameError, что я не могу решить:

 19 print "### Tests of hyperbolic cosine ###" 
    20 x=-2 
---> 21 print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 
    22 x=-1 
    23 print("x=%f cosh(x)=%.10f" % (x,hyperbolicCosine(x))) 

NameError: name 'hyperbolicCosine' is not defined 

Помощь приветствуется.

+4

У вас есть какой-то старый .pyc-файл, который имеет более позднюю дату, чем ваш .py-файл, или .py-файл в другой директории, чем тот, который, по вашему мнению, вы используете? Переименуйте PowerSeries.py временно и импортируйте его под другим именем. –

+0

Как вы используете код 'tests.py', можете ли вы показать точную запятую? Это из интерпретатора ipython? –

+0

Ну, я запускаю test.py код из интерпретатора ipython с помощью команды ** run tests.py **. Но, по словам Патрика Маупина, я действительно решил ошибку, удалив старый файл ** PowerSeries.pyc **. Итак, он работает сейчас, и я добавлю больше определений функций с учетом этой проблемы. Спасибо вам обоим. –

ответ

1

Я не могу комментировать, потому что я слишком новичок, но всегда лучше понять, что нужно импортировать то, что вам нужно из определенного модуля. Если вы всегда это делаете, это может помочь сузить проблему в будущем (т. Е. Вы получите ImportError вместо NameError.)

Кроме того, .pyc-файлы регенерируются на основе метки времени. Похоже, эта проблема более вероятна из-за того, что iPython имеет старый модуль в памяти.

+0

Да, вы правы veggie1. Мне было слишком лениво вводить имена функций. Но я это исправил. Более того, я новый пользователь ipython. Я не знаю, как это работает. Я думаю, мне нужно вникнуть в учебник, объясняющий механизм импорта модулей и связанных с ними команд. Спасибо за ваш совет. –

Смежные вопросы