1闭包
所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象。
闭包作用: 1.封装 2.代码复用
包括了外部函数的局部变量,这些局部变量在外部函数返回后也继续存在,并能被内部函数引用。
LEGB原则:
函数对变量进行引用时 按照 LEGB的顺序进行查找:
L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域(解释器自动添加)
def funx(x):
print('开始')
def funy(y):
print('内部函数')
return x+y
print('结束')
return funy
x=funx(3)
print(x(4))
输出结果:
开始
结束
内部函数
7
2 装饰器
闭包和装饰器之间的关系: 装饰器其实是用闭包来实现的。
上文提到闭包的重要特性:封存上下文,这一特性可以巧妙地被用于现有函数的包装,从而为现有函数增加功能,此乃装饰器。
装饰器本质上也还是一个python函数,它可以让其他函数在不需要的做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的功能
引入日志
函数执行时间统计
执行函数前的预备处理
执行函数后的清理功能
权限校验等场景
缓存
一个函数同时被多个装饰器装饰的执行顺序
一个函数如果同时被多个装饰器装饰,由紧靠函数的装饰器先对函数进行装饰,然后返回的结果在给外层的装饰器去执行装饰,依次类推直到所有装饰器都装饰完成,最后会得到一个函数,在执行这个函数的时候,会先执行最外层装饰器的内容,在执行里面装饰器的内容。
def diguo():
print("底锅50")
return 50
def doupi(f):
def caidan1():
print("豆皮麻资10块")
return 10+f()
return caidan1
def xiangcai(f):
def caidan2():
print("香菜麻资5块")
return 5+f()
return caidan2
print('------------')
@doupi
@xiangcai
def diguo():
print("底锅50")
return 50
x=diguo()
print(x)
结果:
豆皮麻资10块
香菜麻资5块
底锅50
65