локальная переменная 'n' указана перед присваиванием. Затворы - PullRequest
0 голосов
/ 05 октября 2019
def fibonacci_closure(n):
    def fibonaci(): 
         if n == 0: """in this line error occured idk why because in watches i see n=4""" 
            return 0 
         elif n == 1 or n == 2:
            return 1 
         else:
            i = 1 
            j = 1 
            tmp = 1 
            while n != 2: 
                n -=1
                tmp = i 
                i = j + i 
                j = tmp 
            return i 
    return fibonaci

a = fibonacci_closure(4)

a()

Задача: Возвращать замыкание, которое будет генерировать элементы последовательности Фибоначчи при повторном вызове. Пример:

    g = fibonacci_closure()
    g() # 1
    g() # 1
    g() # 2
    g() # 3

UnboundLocalError: локальная переменная 'n', на которую ссылается перед присваиванием

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Числа Фибоначчи являются типичным примером для генераторов. Это только раздражает, почему функция должна возвращать функцию вместо генератора.

def fibonacci_closure():
    def fibonacci():
        i = j = 1
        while True:
            yield i
            i, j = j, i + j
    return fibonacci().__next__
0 голосов
/ 05 октября 2019

Задача, которую вы пытаетесь выполнить, может быть решена путем создания класса. (Или вы можете посмотреть на создание объекта «генератора», который является отдельной вещью.)

Что вам нужно для того, чтобы сохранить значение n от одного обращения к следующему, - это своего рода глобальная переменная,Глобальные переменные в Python возможны, но это плохая практика. То же самое можно сделать из класса, где n хранится и инкапсулируется в этом классе.

Посмотрите на сделанные мной изменения и посмотрите, работает ли теперь функция, как вы предполагали. Ура!

class fibonacci_closure():
    def __init__(self):
        self.n = 0

    def fibonaci(self): 
        if self.n == 0:
            self.n+=1
            print(0) 
        elif self.n == 1 or self.n == 2:
            self.n+=1
            print(1) 
        else:
            i = 1 
            j = 1 
            tmp = 1
            hold = self.n 
            while hold != 2: 
                hold -=1
                tmp = i 
                i = j + i 
                j = tmp
            self.n+=1
            print(i) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...