打印出斐波那契系列

Omi*_*mid 2 python closures fibonacci python-3.x

我正在尝试编写一个简单的Python程序.它应该返回一个返回连续的斐波纳契数的闭包:

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())
Run Code Online (Sandbox Code Playgroud)

我在运行时收到此错误: UnboundLocalError: local variable 'n_1' referenced before assignment

编辑:在我的原始帖子中,我没有包含n = 1在定义中,fibGen但它实际上是一个错字.无论如何我仍会得到同样的错误.

Mar*_*ers 5

Python根据绑定行为确定编译时变量的范围.如果您指定名称,或将其用作import目标(以及其他一些方法),则会在作用域中绑定名称.

你是结合n_1n_2fib()功能; 两人都被分配到.这使得这两个名称在本地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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,您可以使用元组赋值交换两个变量,不需要中介:

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
Run Code Online (Sandbox Code Playgroud)