gpt4 book ai didi

python - 打印斐波那契数列

转载 作者:行者123 更新时间:2023-11-28 21:18:19 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的 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())

我在运行时遇到这个错误:UnboundLocalError:赋值前引用了局部变量“n_1”

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

最佳答案

Python 根据绑定(bind)行为 在编译时确定变量的范围。如果您分配给一个名称,或将其用作 import 目标(以及其他一些方式),您就是在一个范围内绑定(bind)该名称。

您在 fib() 函数中绑定(bind)到 n_1n_2;两者都被分配给。这使得这两个名称在 fib() 中成为 local,Python 甚至不会查看周围的范围。

您需要覆盖此行为,您可以使用 nonlocal statement 来完成此操作:

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 告诉编译器明确您不希望它查看绑定(bind)行为,而是将名称视为闭包。

接下来,您在 if 测试的第一个分支中使用了 n,但是您没有在 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

关于python - 打印斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26803203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com