Discuss / Python / day8.总结与理解

day8.总结与理解

Topic source

小太郎tail

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

关于闭包,我查阅了很多资料,也看了评论区很多大佬的发言,这里总结一下关于作业的四种方法以及我的理解。

对于闭包的理解:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。(这里的引用就是内函数的函数名)

#方法一:利用nonlocal关键字声明变量x,既不是局部变量,也不是全局变量,需要向上一层变量空间找这个变量。只在闭包里面生效,只能用在嵌套函数中,是python3中新添的关键字,python2中无。(作用理解是:x保存内函数counter每次作用后返回的值,比如第一次x=0,counter()后,x=0+1=1,counter()后,x=1+1=2......以此类推)

'''def createCounter():

    x=0

    def counter():

        nonlocal x

        x=x+1

        return x

    return counter'''

#方法二:利用可变数据类型list

'''def createCounter():

    L=[0]   #初始化列表L为0

    def counter():

        L[0]+=1     #L[0]指的是列表L的第一个元素,为一个可变变量

        return L[0]

    return counter'''

#方法三:利用生成器

def createCounter():

    def g():    #生成器生成有序数列1,2,3......

        n=0

        while 1:

            n+=1

            yield n

    a=g()

    def counter():

        return next(a)  #每次调用next()函数获得生成器的下一个返回值

    return counter

#方法四:利用len()

def createCounter():

    L=[]

    def counter():

        L.append(9) #这里只是为了补位,添加任何一个数字都可以的

        return len(L)

    return counter

请问方法一与方法二、四中变量声明区别是什么,为啥一需要用nonlocal,而二、四中的L不需要用nonlocal,不都是变量吗?

小太郎tail

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

nonlocal关键字声明的变量,它既不是局部变量,也不是全局变量,需要向上一层变量空间找这个变量。方法一中,用到这种类型变量需要用nonlocal特别声明;方法二、四中用到了可变变量L是一个局部变量,在Python中,定义了一个变量(局部变量或者可区分的全局变量)且已赋值,那么它的类型就已经确定了,不需要我们定义或声明。

第一种方法也是定义了一个x变量,为什么不加nonlocal就过不去,而用list就可以呢

小太郎tail

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

主要是可变,list本身就是可变数据结构,而第一种方法,如果不加nonlocal,每次调用createCounter(),变量x都会置为0;而加了nonlocal,每次调用createCounter(),x都会置于上次计算返回的x值

地球灬人

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

感谢您的总结,非常有帮助。还有两个不太懂的地方想请教一下:1)例子中count()函数的例子中,在内部函数中使用外部函数的循环变量i,为什么不需要在内部函数中重新使用nonlocal申明呢?2)如果是外部函数的参数,为什么也不需要再在内部函数中使用nonlocal申明,而可以直接调用呢?

_fermat

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

官方解释nonlocal

在子函数里直接声明全局变量不是一样的吗?在主语句部分声明变量初始化,子函数声明全局变量。我认为核心在于如何在函数体内在全局改变某个变量的值,所以可以用可变序列,可以用全局变量。

达蒙阿丁

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

课代表你好!


  • 1
  • 2

Reply