为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英546537 2022-06-14 16:18:30
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 fibonacia = fibonacci_closure(4)a()任务: 返回一个闭包,该闭包将在重复调用时生成斐波那契数列的元素。例子:    g = fibonacci_closure()    g() # 1    g() # 1    g() # 2    g() # 3UnboundLocalError:分配前引用的局部变量“n”
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

斐波那契数是生成器的典型示例。为什么函数应该返回一个函数而不是生成器只是令人恼火的。


def fibonacci_closure():

    def fibonacci():

        i = j = 1

        while True:

            yield i

            i, j = j, i + j

    return fibonacci().__next__


查看完整回答
反对 回复 2022-06-14
?
千巷猫影

TA贡献1829条经验 获得超7个赞

您尝试完成的任务可以通过创建一个类来完成。(或者您可以考虑创建一个“生成器”对象,这是它自己独立的东西。)


为了在一次调用到下一次调用中保留 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) 


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信