Печать серии фибоначчи

Я пытаюсь написать простую программу Python. Он должен возвращать aa замыкание, которое возвращает последовательные числа фибоначчи:

def fibGen(): n_1 = 0 n_2 = 0 n = 1 def fib(): if n_1 ==0 and n_2 ==0: n_1 = 1 return n else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib f = fibGen() for i in range(0,10): print(f()) 

Я получаю эту ошибку во время выполнения: UnboundLocalError: local variable 'n_1' referenced before assignment

EDIT: В моем первоначальном посте я не включил n = 1 в определение fibGen но на самом деле это была опечатка. В любом случае, я все равно получаю такую ​​же ошибку.

  • Анаграмма Python 3
  • Python: избегать бесконечных циклов в __getattribute__
  • socket ResourceWarning с использованием urllib в Python 3
  • unicode и кодировка для персидского или арабского в python3
  • Выпуск синтаксического анализа страницы xhtml с использованием Python
  • Очистка данных excel с помощью python с использованием пакета pandas
  • Отображение только самого высокого из 3 последних результатов, сохраненных в файле .txt
  • Как я могу узнать больше о внутренних компонентах Python?
  • 2 Solutions collect form web for “Печать серии фибоначчи”

    Python определяет область переменных во время компиляции, основанную на поведении привязки . Если вы назначаете имя или используете его как цель import (и несколько других способов), вы привязываете это имя в области.

    Вы привязываетесь к n_1 и n_2 в функции fib() ; оба назначаются. Это делает эти два имени локальными в fib() , и Python даже не будет смотреть на окружающий объем.

    Вам необходимо переопределить это поведение, и вы можете сделать это, используя nonlocal оператор :

     def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 return n else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib 

    nonlocal говорит компилятору явно, что вы не хотите, чтобы он смотрел на поведение привязки, но вместо этого рассматривал имена как замыкания.

    Затем вы используете n в первой ветке теста if , но вы не определили его нигде вне ветви else . Вы должны просто вернуть 1 или иначе:

     def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 return n_1 else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib 

    И последнее, но не менее важное: вы можете поменять местами две переменные, используя назначение кортежей, без посредников:

     def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 else: n_1, n_2 = n_1 + n_2, n_1 return n_1 return fib 

    Вы не можете модифицировать охватывающие переменные, n_1, n_2 находится в пространстве, не входящем в пространство функции, поэтому вы не можете привязывать переменные.

    Использовать ключевое слово nonlocal

     def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 return n_1 # return `n_1` here not `n` else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib f = fibGen() for i in range(0,10): print(f()) 
    Python - лучший язык программирования в мире.