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但它实际上是一个错字.无论如何我仍会得到同样的错误.
Python根据绑定行为确定编译时变量的范围.如果您指定名称,或将其用作import目标(以及其他一些方法),则会在作用域中绑定名称.
你是结合n_1并n_2在fib()功能; 两人都被分配到.这使得这两个名称在本地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)
| 归档时间: |
|
| 查看次数: |
674 次 |
| 最近记录: |