直接看题有点乱,没有头绪,那就先来看一下测试里是怎么验证的:
# 测试: 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('测试失败!')
1、从这里可以看出,counterA是获得计数值的函数,createCounter()要返回的是一个计数器函数的实现,而不是直接获得计数,通过多次调用counterA()得到计数
counterA = createCounter() print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
2、再回头看实现
既然每次调用counterA()(实际调用的是counter())都会得到累加值,那么就应该在计数器函数外有一个记录调用次数的变量,可以放在①处
接下来,既然有了记录次数的变量,顺理成章的,在计数器函数里要做的就是每次调用的时候对①处的变量+1的操作②处,然后返回①处的变量值,这样每次调用计数器的时候就能获得计数值。
def createCounter(): # ① def counter(): # ② return 1 return counter
3、但是这里有涉及外层函数的变量作用域问题,里层函数不能直接使用外部函数的变量,教程前面也没有讲过这个问题,很多人看到这里就会很懵逼,我也是看评论里才知道的,可以在内部函数里,对外部函数的变量使用“nonlocal”关键字声明,这样问题就迎刃而解了。最终函数长这样↓↓↓
def createCounter(): i = 0 def counter(): nonlocal i i += 1 return i return counter
Sign in to make a reply
UTOO_NAIVE
直接看题有点乱,没有头绪,那就先来看一下测试里是怎么验证的:
1、从这里可以看出,counterA是获得计数值的函数,createCounter()要返回的是一个计数器函数的实现,而不是直接获得计数,通过多次调用counterA()得到计数
2、再回头看实现
既然每次调用counterA()(实际调用的是counter())都会得到累加值,那么就应该在计数器函数外有一个记录调用次数的变量,可以放在①处
接下来,既然有了记录次数的变量,顺理成章的,在计数器函数里要做的就是每次调用的时候对①处的变量+1的操作②处,然后返回①处的变量值,这样每次调用计数器的时候就能获得计数值。
3、但是这里有涉及外层函数的变量作用域问题,里层函数不能直接使用外部函数的变量,教程前面也没有讲过这个问题,很多人看到这里就会很懵逼,我也是看评论里才知道的,可以在内部函数里,对外部函数的变量使用“nonlocal”关键字声明,这样问题就迎刃而解了。最终函数长这样↓↓↓