闭包的定义与实现
1)定义
闭包就是指有权访问另一个函数作用于中的变量的函数,具有提高代码可复用性的作用。
2)实现闭包的三个条件
闭包的另一个常用场景就是装饰器
- 函数里面嵌套函数
- 内部函数使用了外部函数的临时变量
- 外部函数的返回值是内部函数的引用
验证闭包的实现条件
1)代码
# 定义函数不执行函数里面的代码,调用函数和时才执行函数里面的代码
# 所以次代码返回值时wrapper
def timeit(name):
# wapper 包装纸
def wapper():
print(name) # 内部函数使用外部函数的变量
return 'ok'
return wapper # 外部函数的返回值是内部函数的引用(函数名)
result = timeit("lyqiu")
print(result)
2)结果展示
调用timeit函数,函数的返回值是wrapper函数引用,上面代码中的result就是wrapper函数
调用函数
1)代码
# 方法1
result1 = result() # result的结果是wapper的函数名,此处等同于result1 = wapper()进行函数的调用
print(result1)
# 方法2
print(result()) #直接在result = timeit('lyqiu') 后打印输出result()
2)结果展示
装饰器的定义
- 器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数,装饰器就是用来装饰函数或类的工具
- 装饰器其实就是在遵循以下两个原则(开放封闭原则)的前提下为被装饰对象添加新功能
开放 | 封闭 |
---|---|
对扩展开放 | 对已经实现的功能代码块封闭,不修改被装饰对象的源代码 |
装饰器的实现
- 装饰器本质上是一个函数,该函数是用来处理其他函数。
- 它可以让其他函数在不需要求改代码的前提下增加额外的功能
- 并且装饰器的返回值也是一个函数对象
- 装饰器装饰的是函数/类,所以需要传递的参数是函数名或者类名
- 使用时: @装饰器名字
装饰器的应用(一)
分为创建装饰器和使用装饰器这两部分
通过下载音乐的练习,使我们对装饰器的使用有一个初步了解
1)实验前提
pip3 install requests -i https://pypi.douban.com/simple
安装
- 为计算下载时间可以使用时间戳
2)代码
import time #时间处理模块
import requests #HTTP请求库,多用于网络爬虫,需要pip install下载
# 1.如何去创建装饰器
#需求:添加功能-计算被装饰函数运行的时间的工具
def timeit(f):
def wrapper(): #添加被装饰函数执行的时间
start = time.time() #函数执行之前计算当前的时间戳
result = f() #调用被装饰的函数,并保存函数的返回值
end = time