Discuss / Python / 结合评论区记录三种方法

结合评论区记录三种方法

Topic source

豆糕啊

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

#方法一:使用nonlocal关键字声明内函数的变量

def createCounter():

    a=0

    def counter():

        nonlocal a #nonlocal声明这个变量不是局部变量空间的变量,需要向上一个层级变量空间找这个变量

        a=a+1

        return a

    return counter

#方法二:使用可变类型数据的闭包变量,如list。方法一和二本质上是一样的,都是在内函数中修改外函数的闭包变量。有两种方法进行修改,一是使用nonlocal关键字在内函数中进行声明,另一种是使用可变类型的数据作为闭包变量,此时在内函数中可以直接修改这个变量的值

def createCounter():

    c=[0]

    def counter():

        c[0]+=1

        return c[0]

    return counter

#方法三:使用generator及next()生成一个计数器

def createCounter():

    def iterator(): #定义一个生成器,逐个生成1,2,3...自然数序列

        n=0

        while True:

            n+=1

            yield n

    g=iterator() #需声明一个变量g指向生成器

    def counter():

        return next(g)

    return counter #注意外函数返回内函数时,内函数名后不能有()

大神!

插个眼学习了

世事逝时

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

好厉害

小宝12216

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

请问为什么第一种方法里每次调用createCounter()函数时为什么a的值都会保存上一次调用的的a的值,而不会因为a=0语句导致a的值归零啊


  • 1

Reply