• 010 函数与闭包


    一:说明

    1.定义

      如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。

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

      一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

    2.程序

     1 #闭包函数的实例
     2 # outer是外部函数 a和b都是外函数的临时变量
     3 def outer( a ):
     4     b = 10
     5     # inner是内函数
     6     def inner():
     7         #在内函数中 用到了外函数的临时变量
     8         print(a+b)
     9     # 外函数的返回值是内函数的引用
    10     return inner
    11 
    12 if __name__ == '__main__':
    13     # 在这里我们调用外函数传入参数5
    14     #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
    15     # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
    16     demo = outer(5)
    17     # 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
    18     # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
    19     demo() # 15
    20 
    21     demo2 = outer(7)
    22     demo2()#17

    3.效果

      

    二:修改变量值

    1.说明

      在基本的python语法当中,一个函数可以随意读取全局数据,但是要修改全局数据的时候有两种方法:

        1 global 声明全局变量 2 全局变量是可变类型数据的时候可以修改

      在闭包内函数也是类似的情况。在内函数中想修改闭包变量(外函数绑定给内函数的局部变量)的时候:

        1 在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。

        2 在python2中,没有nonlocal这个关键字,我们可以把闭包变量改成可变类型数据进行修改,比如列表。

    2.程序

     1 #修改闭包变量的实例
     2 # outer是外部函数 a和b都是外函数的临时变量
     3 def outer( a ):
     4     b = 10  # a和b都是闭包变量
     5     c = [a] #这里对应修改闭包变量的方法2
     6     # inner是内函数
     7     def inner():
     8         #内函数中想修改闭包变量
     9         # 方法1 nonlocal关键字声明
    10         nonlocal  b
    11         b+=1
    12         # 方法二,把闭包变量修改成可变数据类型 比如列表
    13         c[0] += 1
    14         print(c[0])
    15         print(b)
    16     # 外函数的返回值是内函数的引用
    17     return inner
    18 
    19 if __name__ == '__main__':
    20 
    21     demo = outer(5)
    22     demo() # 6  11

    3.效果

      

    三:闭包的个数

    1.说明

      使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量

    2.程序

     1 #coding:utf8
     2 def outer(x):
     3     def inner(y):
     4         nonlocal x
     5         x+=y
     6         return x
     7     return inner
     8 
     9 
    10 a = outer(10)
    11 print(a(1)) 
    12 print(a(3))

    3.效果

      

  • 相关阅读:
    maven超级pom内容
    elasticsearch日志删除命令
    maven 设置跳过测试
    centos7.4 开启ftp服务
    部分Linux时区改为东八区的方法
    docker overlay存储驱动介绍(传送门)
    HotSpot学习(一)——如何下载openjdk源码
    nginx 代理静态资源报 403
    【转载】C#通过遍历DataTable的列获取所有列名
    【转载】C#通过Remove方法移除DataTable中的某一列数据
  • 原文地址:https://www.cnblogs.com/juncaoit/p/9533445.html
Copyright © 2020-2023  润新知