一、内部函数 特点:
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.闭包是理解装饰器的基础