闭包函数的简介
* 封闭在函数内部的函数;
* 也就是换了一种方式将参数和函数返回;
只有满足这两个所描述的才能被称为闭包函数
def func(username):
wsername='yqb'
def index():
print(username)
return index
res=func()
print()
res()
闭包函数的实际应用
* 通过形参的方式进行传值
def func(xxx)
print(xxx)
* 通过闭包函数进行传参
def index(username):
username='yqb'
def func():
print(username):
return func
res=index('yqb')
res()
装饰器的简介
* 在不改变被装饰对象原来的调用方式和内部代码的情况下给被装饰对象添加新的功能
def func():
print(123)
func()
- 装饰器是不许进行修改只允许对外扩展开放
- import time print(time.time())也就是一个时间戳 用来计算代码运行的时间
装饰器前期推导
def index()
time.sleep(3)
print('from index')
start_time=time.time() #在调用index函数之前获取一下时间戳
index() # 调用index函数
end_time=time.time()
print(end_time-start_time)
在这里的index如果有多个那就需要重复编写代码 那么我们就要将其封装成函数
def get_time():
start_time = time.time() # 在调用index函数之前获取一下时间戳
index() # 调用index函数
end_time = time.time()
print('函数的执行时间是:',end_time - start_time)
如果有多个不同的函数需要统计时间那这个解决措施也是不行的 需要给函数体动态传参形参
def home():
time.sleep(5)
print('from home')
def get_time(xxx):
start_time = time.time() # 在调用index函数之前获取一下时间戳
xxx(*args,**kwargs) # 调用index函数
end_time = time.time()
print('函数的执行时间是:',end_time - start_time)
get_time(index)
get_time(home)
不同的形参个数的函数无法共同进行统计 我们使用了*args **kwargs
def func1(a):
time.sleep(1)
print('from func1')
get_time(func1)
这我们改变了原来的调用方式是不可取的 我们需要进行装饰器推到流程
装饰器的固定模板
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
def inner(*args, **kwargs):
print('执行被装饰对象之前可以做的额外操作')
res = func_name(*args, **kwargs)
print('执行被装饰对象之后可以做的额外操作')
return res
return inner
* 装饰器语法糖
语法糖内部原理:
1.使用的时候最好紧跟在被装饰对象的上方
2.语法糖会自动将下面紧挨着的函数名传给@后面的函数调用
import time
@outer # home = outer(真正的函数名home)
def home():
'''我是home函数 我要热死了!!!'''
time.sleep(1)
print('from home')
return 'home返回值'
help(home)
print(home)
home()
def index():
'我是index函数 '
pass
help(index)