python闭包函数与装饰器
什么是闭包?
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
闭包的构成?
在函数嵌套(函数里面再定义函数)的前提下
内部函数使用了外部函数的变量(还包括外部函数的参数)
外部函数返回了内部函数
闭包函数:
定义:内层函数对外层函数非全局变量的引用,就叫做闭包函数。
闭包会一直存在内存当中,不会因为函数执行结束而被释放。
闭包: 保护数据安全、保护数据干净性。
闭包的目的:要接受被装饰的函数和被装饰函数需要的参数
基本模型:
def wrapper():
name = 'xiongsheng'
def inner():
print(name)
inner()
wrapper()
xiongsheng
判断是否为闭包函数:
可以通过print(函数名.__closure__ )看是否有<cell xxxx xxx >类似信息打印,如果有就说明该函数为闭包函数。
name = 'xiongsheng'
def wrapper():
def inner():
print(name)
inner()
print(inner.__closure__) # None 说明该函数不是闭包函数
wrapper()
None
name = 'xiongsheng'
def wrapper(x):
x = name
def inner():
print(x)
inner()
print(inner.__closure__) # <cell at 0x0000000000130C48: str object at 0x0000000001E8A260> 有类似的打印信息说明该函数为闭包函数
wrapper(name)
harry
(<cell at 0x02B77490: str object at 0x00FF73A0>,)
应用场景:
#功能获取网页内容
from urllib.request import urlopen
def zhua(url):
#url='www.baidu.com'
def get():
return urlopen(url).read()
return get
f=zhua('www.baidu.com')
f()
总结:一个函数内部如果需要某个名字关系,有两种方法:
1、通过传参的方式
2、通过闭包的方式,在该函数外层包一层作用域(即再定义一个函数),将需要的名字关系包在外部函数中
装饰器:
定义:用来装饰其他函数,装饰器本身可以是任意可调用对象,被装饰的对象也可以是任意可调用对象。装饰器的本质就是闭包
原则:
1、不修改被装饰对象的源代码。
2、不修改被装饰对象的调用方式。
功能:在遵循原则的前提,为被装饰对象添加上新功能。
装饰器的基本模型
def wrapper(f):
def inner(*args,**kwargs):
"""被装饰函数执行之前的操作"""
ret = f(*args,**kwargs)
"""被装饰函数执行之后的操作"""
return ret
return inner
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界