Discuss / Python / 作业思路分析

作业思路分析

Topic source

UTOO_NAIVE

#1 Created at ... [Delete] [Delete and Lock User]

直接看题有点乱,没有头绪,那就先来看一下测试里是怎么验证的:

# 测试:
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

  • 1

Reply