装饰器:本质就是函数 功能是为其他函数添加辅助功能
原则:不修改被修饰函数的源代码
不修改被修饰函数的调用方式
import time def cal (l): start_time=time.time() #+ res=0 for i in l: res+=i stop_time=time.time() print('函数运行时间是%s'%(stop_time-start_time)) #+ return res
装饰器=高阶函数+函数嵌套+闭包
例子1:高阶函数
import time def foo(): time.sleep(3) print('hello Mr.lin') def timer(func): print(func) start_time=time.time() func() stop_time=time.time() print('函数运行的时间是%s'%(stop_time-start_time)) ##timer(foo) #改变了调用方式XXX foo=timer(foo) foo() #未修改调用方式 ###BUT 多执行了一次
例子2:函数嵌套 闭包
def father(name): print('from father%s'%name) def son(): print('my father is %s'%name) son() father('ABC')
例子3:
装饰器框架
@timmer def timer(func): def wrapper(): start_time=time.time() func() stop_time=time.time() print('函数运行的时间是%s'%(stop_time-start_time)) return wrapper def test(): time.sleep(3) print('test函数运行完毕') #test=timer(test) #test() @timmer相当于上述二行 语法行
例子4:
加上返回值
def timer(func): def wrapper(): start_time=time.time() res=func() #取返回值 stop_time=time.time() print('函数运行的时间是%s'%(stop_time-start_time)) return res return wrapper def test(): time.sleep(3) print('test函数运行完毕') return (123)
例子5:
加上参数
def timer(func): def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #不固定个数参数
stop_time=time.time()
print('函数运行的时间是%s'%(stop_time-start_time))
return res
return wrapper
def test():
time.sleep(3)
print('test函数运行完毕,名字是%s,年龄是%s, 性别是%s'%(name,age,gender)) return (123)
解压序列
l=(1,2,3,4,5,7,6,8)
a,_*,c=l
a=1,c=8
京东后端示例:
def auth_func(func) def wrapper(*args,**kwargs): username=input('用户名').strip() passwd=input('用户名').strip() if username =='sb' and passwd == '123' res=func(*args,**kwargs) return res else: print('error') return wrapper @auth_func def index(): print('welcome to jingdong') def home(): print('welcome home') def shopping_car(): print('there is [%s,%s,%s] in shopping_car'%('奶茶','可乐','牛奶')) def order(): pass
登录升级版
def auth_func(func): def wrapper(*args,**kwargs): if user_dic['username'] and user_dic['login'] res=func(*args,**kwargs) return res username=input('用户名').strip() passwd=input('用户名').strip() if username =='sb' and passwd == '123' user_dic['username']=username user_dic['login']=TRUE res=func(*args,**kwargs) return res else: print('error') return wrapper
#不必刷新一下页面输入一次密码 改变了变量