Discuss / Python / 3 solutions to createCounter()

3 solutions to createCounter()

Topic source

KonoNA7

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

Solution 1:

def createCounter1():
    li = [0]
    def counter():
        li.append(li[-1] + 1)
        return li[-1]
    return counter

Solution 2:

def createCounter2():
    n = 0
    def counter():
        nonlocal n # 使用外层变量
        n += 1
        return n
    return counter

Solution 3:

def createCounter3():
    def f(): 
        n = 1
        while 1:
            yield n
            n += 1
    fn = f()
    def counter():
        return next(fn)
    return counter

KonoNA7

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

优化了一下Solution 1:

def createCounter1():
    li = [0]
    def counter():
        li[0] += 1
        return li[0]
    return counter

或者

def createCounter1():
    li = [1]
    def counter():
        li.insert(0, li[0] + 1)
        return li.pop()
    return counter

Carlos_EN

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

请问第一种方法里,调用后面的counterA()的时候,li为什么不会再定义为0?

KonoNA7

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

你可以理解为li = [0]只会在counterA = createCounter()赋值语句时执行,调用counterA()只执行counter()函数,并且可以使用li这个变量。

我想问下,前面的 f1, f2, f3 为什么能带入;或者说这里的1、2、3怎么会带入到函数内的;fs又不是函数,它是list不是,list要带入不得这样的吗 f[1];

谢谢,前面那个讲解也没看明白

KonoNA7

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

@用户7041329703

不好意思,我没能理解你的问题,可以阐述得再清楚一些吗:(

不好意思,同样很疑惑在第一种方法里,为什么后续调用counterA()的时候Li不会重新赋值为0

KonoNA7

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

@胖紫爱吃肉

因为counterA指向的不是createCounter(),而是counter()

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

li = [0]不在这个函数里面,后续再怎么调用counterA()都不会再执行这条语句。

谢谢,我再自行理解下

同样的疑问,还是无法理解 在第一种方法里 在定义countA时, counterA = createCounter() 不就是理解为countA指向了counterA = createCounter()? 而在createCounter()函数里应该是顺序执行 既然是顺序执行的话 在第二次第三次调用的时候难道没有重新定义li=[0]? 求大神解释一下我在哪个环节理解错了


Reply