Python3-内部函数 和 闭包

 一、内部函数 特点:
    1.可以访问外部函数的变量
    2.内部函数可以修改外部函数的可变类型的变量,比如:list
    3.内部函数修改全局的不可变变量时,需要在内部函数声明 global  变量名
      ............外部函数..........,......声明:nonlocal 变量名
    4.locals()查看本地变量有哪些,以字典的形式输出
    5.globals()内置函数查看全局变量有哪些,以字典的形式输出(注意里面会有一些系统的键值对存在)
 
示例:
   
 1  a = 100
 2 print(globals())
 3  
 4 def func():
 5     # 声明变量
 6     b = 99
 7     # 声明函数
 8     def inner_func():
 9         c = 88
10         print(a,b,c)
11     inner_func()
12     print(locals())
13     # 使用locals()内置函数进行查看,可以看到在当前函数中声明的内容有哪些
14 func()
结果:
1 {'__name__': '__main__', '__spec__': None, 'a': 100, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002BB5BE49A58>, '__package__': None, '__doc__': None, '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/SakuraUMR/function/demo.py'}
2 100 99 88
3 {'inner_func': <function func.<locals>.inner_func at 0x000002B53A26A598>, 'b': 99}

 

 
二、闭包条件:
        1.外部函数中定义了内部函数
        2.外部函数是有返回值
        3.返回的值是:内部函数名
        4.内部函数引用了外部函数的变量
 
        格式:        
1 def 外部函数():
2     ...
3      def 内部函数():
4         ...
5      return 内部函数
        示例:
1 def func():
2     a = 100
3     def inner_func():
4         print(a)
5     return inner_func
6  
7 f = func()
8 f()

 

        结果:100
 
三、闭包-----缺点:
        1.作用域没有那么直观
        2.因为变量不会被垃圾回收,所以有一定的内存占用问题
 
四、闭包-----作用
        1.可以使用同级的作用域
        2.读取其他元素的内部变量
        3.延长作用域
 
五、闭包-----总结:
        1.闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成
        2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
        3.必报的好处,使代码变得简洁,便于阅读代码
        4.闭包是理解装饰器的基础
 
posted @ 2020-05-31 12:57  闹点小情绪q  阅读(103)  评论(0编辑  收藏  举报