函数补充与装饰器介绍
目录
今日补充函数的另一种用法冲刺吧年轻人!!!!!
一.闭包函数
闭包函数分为两大特性
1.闭:
定义在函数内部的函数(先定义在调用)
2.包:
内部函数使用了外层函数名称空间中的
def outer():
x = 999
def inner():
print(user name', x)
return inner
ser = outer()
ser()
# 结果999 符合闭包函数的特征
二.闭包函数的实际应用
闭包函数是给函数体传参的另一种方式
1.函数体传参:形参
def oute(username):
print(username)
oute('jason')
# 结果 jason
函数体代码要什么写什么
2.函数体传参:闭包
def outer(username):
def index():
print(username)
return index
res = outer('kevin') # 形参username与值kevin临时绑定到局部名称空间中
res()
# 结果 kevin
三.装饰器简介
1.装饰器本质:
是在不改变被装饰对象原有的‘调用方式’和‘内部代码’的情况下给被装饰对象添加新的功能
2.装饰器的原则:
对扩展开放 对修改封闭
import time
def index():
time.sleep(3) #让程序原地等待3面后运行
print('from index')
'''给index函数增加了一个统计执行时间的功能'''
start_time = time.time() # 函数执行之前获取一个时间戳
index()
end_time = time.time() # 函数执行之后获取一个时间戳
print(end_time - start_time) # 两个时间戳的差值就是函数的执行时间
四.建议简易版本装饰器
五.进阶版本装饰器
def outer(func_name):
def get_time(*args, **kwargs):
start_time = time.time()
func_name(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return get_time
# 解决的是参数问题
六.完整版装饰器
# 解决的是返回值问题
def outer(func_name):
def get_time(*args, **kwargs):
start_time = time.time()
res = func_name(*args, **kwargs) # 执行真正的index函数
end_time = time.time()
print(end_time - start_time)
# return '不要急躁' # 如何在此处返回真正index函数的返回值
return res
return get_time
七.重要环节 装饰器模板(通用类型)
def outer(func_name): # func_name用于接收被装饰的对象(函数)
def inner(*agrs, **kwargs):
print('执行被装饰之可进行的操作')
res = func_name(*agrs, **kwargs) #执行真正被装饰的函数
print('执行被装饰函数之后的额外操作')
return res # 返回真正的函数返回值
return inner
八.装饰器的语法糖
还是为了让代码编写更加简洁
def outer(func_name):
def inner(*args, **kwargs):
print('执行函数之前的操作')
res = func_name(*args, **kwargs)
# 额外操作
return res
return inner
@outer # 等价于 index = outer(index)
def index(*args, **kwargs):
print('from index')
# index = outer(index) # 不好看
@outer # 等价于 home = outer(home)
def home(*args,**kwargs):
print('from home')
8.1语法糖内部原理
1.使用时候紧跟在被装饰对象的上方
2.语法糖会自动将下边紧挨这的函数名传输给@后边函数调用
九.装饰器修复技术
from functools import wraps
def outer(func_name):
@wraps(func_name)
def inner(*args, **kwargs):
print('执行被装饰对象之前可以做的操作')
res = func_name(*args, **kwargs)
return res
return inner
@outer
def index():
print('from index')
@outer
def home():
'''这是home函数的注释'''
print('from home')
# help(home) # help可以查看指定函数的注释信息
# help(len)
# index() # 目前的以假乱真 有瑕疵
# print(index)
# help(home)
# help(index)
# print(home)
# print(index)
home()
index()