装饰器和高阶函数
Posted gl-gl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器和高阶函数相关的知识,希望对你有一定的参考价值。
"""
装饰器:本质就是函数
功能:为其他函数添加附加功能
原则:不修改被修饰函数的源代码
不修改被调用函数的调用方式
装饰器 = 高阶函数 + 函数嵌套 + 闭包
"""
"""
#高阶函数:
#函数的返回是一个函数名
#函数接受的参数是一个函数名
#满足上述其中一种为高阶函数
"""
1 import time 2 def foo(): 3 time.sleep(3) 4 print(‘来自foo‘) 5 def timer(func): 6 start_time = time.time() 7 func() 8 stop_time = time.time() 9 print(‘函数运行的时间为%s‘%(stop_time-start_time)) 10 return func 11 foo = timer(foo) 12 foo()
运行结果:
来自foo 函数运行的时间为3.0148422718048096 (隔三秒): 来自foo Process finished with exit code 0
装饰器的实现:
1 import time 2 def summ(func):#装饰器 3 time.sleep(3) 4 print(‘summ函数运行结束‘) 5 def wap(): 6 start_time = time.time() 7 func() 8 stop_time = time.time() 9 print(‘时间差为%s‘%(stop_time-start_time)) 10 return wap 11 @summ # @summ 相当于 test = summ(test) @语法糖 12 def test(): 13 time.sleep(2) 14 print(‘test函数运行结束‘) 15 # res = summ(test) 16 #res() 17 # test = summ(test) 18 test()
(隔三秒): summ函数运行结束 test函数运行结束 时间差为2.01023530960083 Process finished with exit code 0
装饰器实现加返回值:
1 import time 2 def summ(func):#func = test 3 print(‘这是summ函数‘) 4 def wap(): 5 print(‘wap函数‘) 6 start_time = time.time() 7 res = func()#运行test() 8 stop_time = time.time() 9 print(‘test()函数运行时间为%s‘%(stop_time-start_time)) 10 return res#运行的是test()函数 所以返回值为test()的return值 11 return wap 12 @summ #test = summ(test) 13 def test(): 14 time.sleep(3) 15 print(‘test函数执行完毕‘) 16 return ‘这是test的返回值‘ 17 # test() 18 res = test()#运行wap() 所以返回值为wap()的返回值 19 print(res)#wap()的返回值
运行结果:
这是summ函数 wap函数 test函数执行完毕 test()函数运行时间为3.0004074573516846 这是test的返回值 Process finished with exit code 0
装饰器被(@)修饰加参数:
1 import time 2 def summ(func):#func = test 3 print(‘这是summ函数‘) 4 def wap(*args,**kwargs): 5 print(‘wap函数‘) 6 start_time = time.time() 7 res = func(*args,**kwargs)#运行test() 8 stop_time = time.time() 9 print(‘test()函数运行时间为%s‘%(stop_time-start_time)) 10 return res#运行的是test()函数 所以返回值为test()的return值 11 return wap 12 @summ #test = summ(test) 13 def test(name,age): 14 time.sleep(3) 15 print(‘test函数执行完毕,姓名是%s,年龄是%d‘%(name,age)) 16 return ‘这是test的返回值‘ 17 res = test(‘alex‘,18)#运行wap() 所以返回值为wap()的返回值 18 print(res)#wap()的返回值 19 20 21 def test1(name,age,sex): 22 time.sleep(1) 23 print(‘test函数执行完毕,姓名是%s,年龄是%d,性别是%s‘%(name,age,sex)) 24 return ‘这是test的返回值‘ 25 res1 = test1(‘alex‘,18,‘male‘)#运行wap() 所以返回值为wap()的返回值 26 print(res1)#wap()的返回值
运行结果:
这是summ函数 wap函数 test函数执行完毕,姓名是alex,年龄是18 test()函数运行时间为3.013343095779419 这是test的返回值 test函数执行完毕,姓名是alex,年龄是18,性别是male 这是test的返回值 Process finished with exit code 0
验证功能装饰器:
1 user_list = [ 2 {‘name‘:‘alex‘,‘passwd‘:‘123‘}, 3 {‘name‘:‘g_l‘,‘passwd‘:‘123456‘}, 4 {‘name‘:‘aiji‘,‘passwd‘:‘123‘}, 5 {‘name‘:‘wuji‘,‘passwd‘:‘123‘} 6 ]#用户信息 7 current_dic = {‘username‘:None,‘login‘:False}#当前用户状态 8 def auth_func(func): 9 def swap(*args,**kwargs): 10 if current_dic[‘username‘] and current_dic[‘login‘]: 11 res = func(*args, **kwargs) 12 return res 13 username = input(‘用户名:‘).strip() 14 passwd = input(‘密码:‘).strip() 15 for user_dic in user_list: 16 if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]: 17 current_dic[‘username‘]=username 18 current_dic[‘login‘]=True 19 res = func(*args, **kwargs) 20 return res 21 else: 22 print(‘用户名或者密码错误‘) 23 # if username == ‘g_l‘and passwd == ‘123‘: 24 # user_dic[‘username‘]=username 25 # user_dic[‘login‘]=True 26 # res = func(*args,**kwargs) 27 # return res 28 # else: 29 # print(‘用户名或者密码错误‘) 30 return swap 31 @auth_func 32 def home(name): 33 print(‘欢迎回家%s‘%name) 34 @auth_func 35 def shopping_car(name): 36 print(‘%s购物车里有:%s,%s,%s‘%(name,‘CPU‘,‘内存条‘,‘固态硬盘‘)) 37 @auth_func 38 def index(): 39 print(‘欢迎来到京东‘) 40 41 print(‘before--->‘,current_dic) 42 index() 43 print(‘after--->‘,current_dic) 44 home(‘g_l‘) 45 shopping_car(‘g_l‘)
运行结果:
before---> {‘username‘: None, ‘login‘: False} 用户名:g_l 密码:123456 欢迎来到京东 after---> {‘username‘: ‘g_l‘, ‘login‘: True} 欢迎回家g_l g_l购物车里有:CPU,内存条,固态硬盘 Process finished with exit code 0
验证功能装饰器加参数:
1 user_list = [ 2 {‘name‘:‘alex‘,‘passwd‘:‘123‘}, 3 {‘name‘:‘g_l‘,‘passwd‘:‘123456‘}, 4 {‘name‘:‘aiji‘,‘passwd‘:‘123‘}, 5 {‘name‘:‘wuji‘,‘passwd‘:‘123‘} 6 ]#用户信息 7 current_dic = {‘username‘:None,‘login‘:False}#当前用户状态 8 def auth(auth_type ): 9 def auth_func(func): 10 def swap(*args,**kwargs): 11 print(‘认证类型是:‘,auth_type) 12 if auth_type == ‘filedb‘: 13 if current_dic[‘username‘] and current_dic[‘login‘]: 14 res = func(*args, **kwargs) 15 return res 16 username = input(‘用户名:‘).strip() 17 passwd = input(‘密码:‘).strip() 18 for user_dic in user_list: 19 if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]: 20 current_dic[‘username‘]=username 21 current_dic[‘login‘]=True 22 res = func(*args, **kwargs) 23 return res 24 else: 25 print(‘用户名或者密码错误‘) 26 elif auth_type==‘ldap‘: 27 print(‘ldap认证类型 ,但是不会玩‘) 28 res = func(*args, **kwargs) 29 return res 30 else: 31 print(‘不知道这是什么认证类型‘) 32 res = func(*args, **kwargs) 33 return res 34 return swap 35 return auth_func 36 @auth(auth_type=‘glgl‘) 37 def index(): 38 print(‘欢迎来到京东‘) 39 @auth(auth_type=‘filedb‘)#运行auth函数 将auth_func = auth_type=‘filedb‘传给下层函数 相当于@auth_func(添加了一个auth_type的形参) 40 def home(name): 41 print(‘欢迎回家%s‘%name) 42 43 @auth(auth_type=‘ldap‘) 44 def shopping_car(name): 45 print(‘%s购物车里有:%s,%s,%s‘%(name,‘CPU‘,‘内存条‘,‘固态硬盘‘)) 46 47 48 # print(‘before--->‘,current_dic) 49 50 index() 51 # print(‘after--->‘,current_dic) 52 home(‘g_l‘) 53 shopping_car(‘g_l‘)
运行结果:
认证类型是: glgl 不知道这是什么认证类型 欢迎来到京东 认证类型是: filedb 用户名:g_l 密码:123456 欢迎回家g_l 认证类型是: ldap ldap认证类型 ,但是不会玩 g_l购物车里有:CPU,内存条,固态硬盘 Process finished with exit code 0
以上是关于装饰器和高阶函数的主要内容,如果未能解决你的问题,请参考以下文章