增量定义为:
def increment(x):
return x + 1
以下工作,并吐出8的结果:
def repeated(f, n):
def h(x):
counter = 0
while counter < n:
x = f(x)
counter += 1
return x
return h
addthree = repeated(increment,3)
addthree(5)
以下代码错误并告诉我在分配之前我正在引用n:
def repeated3(f,n):
def h(x):
total=0
while n != 0:
total = f(x) + total
n -= 1
return total
return h
addthree = repeated(increment,3)
addthree(5)
为什么当我尝试递减n时错误抛出,即使我被允许在它之前的逻辑语句中使用它?
答案 0 :(得分:3)
当函数嵌套时,在内部函数中使用外部函数的参数或变量称为闭包。
因此,如果要使用递减循环,则需要将repeatition参数复制到可写的局部变量。
In [10]: def r(f,n):
....: def h(x):
....: total = 0
....: m = n
....: while m!=0:
....: total += f(x)
....: m -= 1
....: return total
....: return h
....:
In [11]: r(increment, 3)(0)
Out[11]: 3
这不是以前发布的递增repeated()
函数代码的问题,因为虽然重复参数n
也是一个闭包,但它在比较中只读,而不是写入
答案 1 :(得分:1)
第一个函数的作用是因为您没有使用n
将n -= 1
分配/变换为新值,而是将n
分配给新值,因此您要创建一个局部变量{ {1}}未使用外部函数中的n
,因此当您在本地范围内使用n
时,local variable 'n' referenced before assignment
未定义n
错误。
在python3中,您可以使用while n != 0:
关键字:
nonlocal
如果您使用的是python2,可以重新分配一个新变量以指向def repeated3(f, n):
def h(x):
nonlocal n
total = 0
while n != 0:
total = f(x) + total
n -= 1
return total
return h
并使用它或使用dict:
n
你也可以把它变成一个函数属性:
def repeated3(f,n):
n = {"n":n}
def h(x):
total = 0
while n["n"] != 0:
total = f(x) + total
n["n"] -= 1
return total
return h
addthree = repeated3(increment,3)
addthree(5)
还有许多其他的解决方法,但重点是你可以阅读但不改变闭包变量,在本地范围内创建def repeated3(f,n):
repeated3.n = n
def h(x):
total = 0
while repeated3.n != 0:
total = f(x) + total
repeated3.n -= 1
return total
return h
addthree = repeated3(increment,3)
会导致n
成为局部变量,这意味着{ {1}}正在本地范围内查找n,因此您获得了n
答案 2 :(得分:0)
你需要将'n'传递给h(x),使其成为本地的。所以你有h(x,n = n)。