一、闭包
1.闭包的概念(维基百科)
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
上面提到了两个关键的地方: 自由变量 和 函数, 这两个关键稍后再说。还是得在赘述下“闭包”的意思,望文知意,可以形象的把它理解为一个封闭的包裹,这个包裹就是一个函数,当然还有函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以在随着包裹到处游荡。当然还得有个前提,这个包裹是被创建出来的。
在Python中,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。
实例一:
def line_config(content, lenth): def line(): print('-'*(lenth//2)+content+'-'*(lenth//2)) return line line1 = line_config('闭包', 40) line1() line1()
G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py
--------------------闭包--------------------
--------------------闭包--------------------
注意事项:
1)闭包中,若修改引用的外层变量,需要使用 nonlocal变量声明,否则当做是闭包内新定义的变量
2)当闭包内引用了一个后期会发生变化的变量时,一定要注意
实例二:
def test(): num = 10 def test1(): num = 66 #不改变外部变量值 print(num) print(num) test1() print(num) return test1 result = test()
G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py
10
66
10
若想改变外部变量值,需添加nonlocal
实例三:
def test(): num = 10 def test1(): nonlocal num num = 66 print(num) print(num) test1() print(num) return test1 result = test() G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py 10 66 66
实例三:
def test(): funcs = [] for i in range(1, 4): def test1(): print(i) funcs.append(test1) return funcs newFuncs = test() print(newFuncs) newFuncs[0]() newFuncs[1]() newFuncs[2]() G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py [<function test.<locals>.test1 at 0x000001F59E5E4C80>, <function test.<locals>.test1 at 0x000001F59E5E4D08>, <function test.<locals>.test1 at 0x000001F59E5E4BF8>] 3 3 3
实例四:
def test(): funcs = [] for i in range(1, 4): def test1(num): def inner(): print(num) return inner funcs.append(test1(i)) return funcs newFuncs = test() newFuncs[0]() newFuncs[1]() newFuncs[2]() G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py 1 2 3
二、装饰器
#装饰器 def checklogin(func): def inner(): print('登录验证') func() return inner @checklogin def fss(): print('发说说') @checklogin def ftp(): print('发图片') flag = 2 if flag == 1: fss() else: ftp() G:\超哥\python3编程\python3基础\venv\Scripts\python.exe G:/超哥/python3编程/python3基础/python函数.py 登录验证 发图片