闭包

一、了解函数的执行

def hello():

    print("hello")

hello()

看一下上面的代码的执行过程,代码在解释器中是按照顺序的,一开始从上往下执行时,在执行第一行语句时并不会跳入函数体,因为此时的一二行代码只是对函数进行了定义,只有当执行到hello()时,它才往后进入函数体进行执行。

二、了解函数的定义,调用,函数名,函数引用

1.函数定义,上面的一二行就是对函数进行定义

def 函数名():

    函数体

2.调用,python中对函数的调用使用 函数名()

3.函数名就是def和()之间的字符

4.函数引用,函数引用就是把函数名赋于另一个变量,这个变量和函数名指向同一个地址空间,同样可以调用函数。

通过hello,a两个变量可以看出他们属于同种类型,通过id()变量可以看出他们指向同一内存空间。

三、闭包

def out(ms):
    def init():
        print(ms)
    return init
printer=out(1)
printer()

先看这样一段代码,代码由上往下执行,第一行是对函数进行定义,但是没有进入函数体,直到第五行,这行先执行右边部分,1作为实参代替ms的位置,调用函数,进入函数体,这时可以看出不同的是,函数体里面还定义一个函数,二到三行,这是虽然进入了外面的函数体,可是里面的函数依旧是函数定义,所以并没有进入它函数体,外面函数体最后返回了里面函数的函数名,所以我们可以像上面的例子一样定义一个变量对函数进行引用,也从上面看出,引用的变量名加上()也一样能对函数进行调用,而此时要清楚,我们返回的是里面函数的函数名,我们定义的printer是对init函数的引用,最后一行其实就是对init()函数的调用。

也就进入init函数,调用print语句,而此时刚刚好用到前面的形参ms,在前面,其实系统以及把实参1传进了形参ms里面,所以此时对ms输出。

1.闭包:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。

由此可见,上面的例子其实是一个闭包。闭包有两个特征:

1.把某个函数当成对象返回,上面例子中把init当成对象返回

2.夹带着外部变量,在上面例子中ms是外部变量

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章