题目:
利用闭包返回一个计数器函数,每次调用它返回递增整数?
def createCounter():
def counter():
pass
return contnter
# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
最初版本:
def createCounter():
def counter():
n += 1
return n
n = 0
return counter
报局部变量引用错误:
UnboundLocalError: local variable 'n' referenced before assignment
使用nonlocal修饰(nonlocal修饰变量后,标识该变量是上一级函数中的局部变量):
def createCounter():
def counter():
nonlocal n
n += 1
return n
n = 0
return counter
使用列表(list 在内层函数中重新赋值的时候,不会被认为是重新声明新变量,不改变 i 的引用,只改变里面的值。):
def createCounter():
def counter():
t[0] += 1
return t[0]
t = [0]
return counter
使用函数的属性:
def createCounter():
def counter():
counter.n += 1
return counter.n
counter.n = 0
return counter
使用生成器:
def createCounter():
def g_counter():
n = 0
while True:
n += 1
yield n
g = g_counter()
def counter():
return (next(g))
return counter