赋值前引用的局部变量“n”。闭包

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”


慕桂英546537
浏览 83回答 2
2回答

ITMISS

斐波那契数是生成器的典型示例。为什么函数应该返回一个函数而不是生成器只是令人恼火的。def fibonacci_closure():    def fibonacci():        i = j = 1        while True:            yield i            i, j = j, i + j    return fibonacci().__next__

千巷猫影

您尝试完成的任务可以通过创建一个类来完成。(或者您可以考虑创建一个“生成器”对象,这是它自己独立的东西。)为了在一次调用到下一次调用中保留 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) 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python