一、闭包函数
1、什么是闭包函数
闭:封闭
包:包裹
闭包函数是函数嵌套、函数对象、名称空间和作用域的集合体。
## 1、闭包函数必须在函数内部定义
##2、闭包函数可以引用外层函数的名字
2、闭包函数结构
def outer(x): def inner(): print(x) return inner inner = outer(2) inner()
3、传参方式
3.1、直接传参
3.2、闭包传参
4、闭包函数的应用
#需求:爬取某个网站,打印获取数据的长度
#方法一: 直接传参 import requests def spider_func(url): response = requests.get(url) #发送地址请求指令,获取响应数据 if response.status_code == 200: # 判断状态码,200表示访问状态成功 # print(response.text) #获取数据文本 print(len(response.text)) #统计数据长度 url = 'https://www.baidu.com/' spider_func(url) #方法二:通过闭包函数接收url地址,执行爬取数据 import requests def spider_func(url): def inner(): response = requests.get(url) if response.status_code == 200: print(len(response.text)) return inner baidu = spider_func('https://www.baidu.com/') baidu()
二、装饰器
1.1、什么是装饰器
装饰:装饰,修饰
器:工具
装饰的工具。
***** 开放:对函数功能的添加是开放的。
封闭:对函数功能的修改是封闭的。
1.2、作用
在不修改被装饰对象的 源代码 和 调用方式 的前提下,添加新的功能。
1.3、定义必须遵循
不修改被装饰对象的源代码。
不修改被装饰对象的调用方式。
1.4、为什么使用闭包函数
可以解决代码的冗余,提高代码的可扩展性。
1.5、使用
应用:统计时间, 登录认证,插入日志,性能测试,事物处理,缓存,权限校验等。
例:需求:
统计下载电影的时间
import time def download_movie(*args,**kwargs): print('开始下载电影...') time.sleep(3) print('电影下载成功') return 123 def outer(f): #f = download_movie def inner(*args,**kwargs): star_time = time.time() res = f(*args,**kwargs) #f(*args,**kwargs)----> download_movie(*args,**kwargs) end_time = time.time() print(f'消耗时间为:{end_time - star_time}') return res return inner download_movie = outer(download_movie) download_movie()
2、装饰器语法糖
@:装饰器的语法糖
注意: 在使用装饰器语法糖时,装饰器必须定义在被装饰对象之上。
例:
import time def outer(func): #被装饰对象 def inner(*args,**kwargs): #被装饰对象的函数 start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(f'消耗时间:{end_time - start_time}') return res return inner # download_movie = outer(download_movie) # download_movie() @outer def download_movie(): print('开始下载电影...') time.sleep(3) print('电影下载成功') return 123 download_movie()