利用闭包返回一个计数器函数,每次调用它返回递增整数——Python学习笔记

1. 题目: 利用闭包返回一个计数器函数

1.1 解答一

利用全局变量的性质,python在函数中调用全局变量,注意得加上global,同时无论在那里修改,都会全局影响;代码如下:

s = 0 #设置全局变量
def createCounter():
    def counter():
        global s #引用全局变量
        s = s+1
        return s
    return counter

# 测试:
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')

1.2 解答二

这个解答是借鉴一位前辈的,其实思路很简单,但是我们一般想的就是在外层函数设一个变量s = 0 ,然后内层函数对s做修改,但是如果这样写的话,会报UnboundLocalError: local variable ‘s’ referenced before assignment 错误,也就是s已经被定义了。

def createCounter():
    s = 0
    def counter():
        s += 1
        return s
    return counter
# 错误信息
# UnboundLocalError: local variable 's' referenced before assignment

这是因为在函数内部对变量赋值进行修改后,该变量就会被python解释器认为是局部变量而非全局变量,当程序执行到s += 1的时候,因为这条语句是给s赋值,所以s成为了局部变量,那么在执行s += 1的时候,因为s这个局部变量还没有定义,自然就会抛出这样的错误。

下面这种做法是将s

def createCounter():
    s = [0]
    def counter():
        s[0] = s[0]+1
        return s[0]
    return counter

这种做法就很巧妙,s[0] = s[0]+1 这句代码并没有直接对s赋值,而是更改的s中的内容,所以自然就可行了。

你可能感兴趣的:(Python)