python开发学习 day20-python函数(高阶函数、嵌套函数、装饰器)
一、高阶函数
''' 高阶函数定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可称之为高阶函数 ''' # import time # def foo(): # time.sleep(3) # print('你好啊林师傅') # # def test(func): # # print(func) # start_time=time.time() # func() # stop_time = time.time() # print('函数运行时间是 %s' % (stop_time-start_time)) # # foo() # test(foo) # def foo(): # print('from the foo') # def test(func): # return func # res=test(foo) # # print(res) # res() # foo=test(foo) # # # print(res) # foo() import time def foo(): time.sleep(3) print('来自foo') #不修改foo源代码 #不修改foo调用方式 #多运行了一次,不合格 # def timer(func): # start_time=time.time() # func() # stop_time = time.time() # print('函数运行时间是 %s' % (stop_time-start_time)) # return func # foo=timer(foo) # foo() #没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能 def timer(func): start_time=time.time() return func stop_time = time.time() print('函数运行时间是 %s' % (stop_time-start_time)) foo=timer(foo) foo()
二、嵌套函数
# def bar(): # print('from bar') # # def foo(): # print('from foo') # def test(): # pass def father(auth_type): # print('from father %s' %name) def son(): # name='linhaifeng_1' # print('我的爸爸是%s' %name) def grandson(): print('我的爷爷是%s' %auth_type) grandson() # print(locals()) son() # father('linhaifeng') father('filedb')
三、闭包
封闭的变量 (函数及变量)
四、装饰器
装饰器 = 高阶函数 + 嵌套函数 + 闭包
五、装饰器实现
import time def timmer(func): #func=test def wrapper(): # print(func) start_time=time.time() func() #就是在运行test() stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return wrapper @timmer #test=timmer(test) def test(): time.sleep(3) print('test函数运行完毕') test() # res=timmer(test) #返回的是wrapper的地址 # res() #执行的是wrapper() # test=timmer(test) #返回的是wrapper的地址 # test() #执行的是wrapper() # @timmer 就相当于 test=timmer(test)
六、添加返回值的装饰函数
import time def timmer(func): #func=test def wrapper(): # print(func) start_time=time.time() func() #就是在运行test() stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return wrapper @timmer #test=timmer(test) def test(): time.sleep(3) print('test函数运行完毕') test() # res=timmer(test) #返回的是wrapper的地址 # res() #执行的是wrapper() # test=timmer(test) #返回的是wrapper的地址 # test() #执行的是wrapper() # @timmer 就相当于 test=timmer(test)
七、添加参数的装饰函数
import time def timmer(func): #func=test1 def wrapper(*args,**kwargs): #test('linhaifeng',age=18) args=('linhaifeng') kwargs={'age':18} start_time=time.time() res=func(*args,**kwargs) #就是在运行test() func(*('linhaifeng'),**{'age':18}) stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return res return wrapper # @timmer #test=timmer(test) def test(name,age): time.sleep(3) print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age)) return '这是test的返回值' @timmer def test1(name,age,gender): time.sleep(1) print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender)) return '这是test的返回值' # res=test('linhaifeng',age=18) #就是在运行wrapper # # print(res) # test1('alex',18,'male') test1('alex',18,'male') # def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{}) # #name,age,gender=('alex',18,'male','x','y') # print(name) # print(age) # print(gender) # # def test1(*args,**kwargs): # test2(*args,**kwargs) #args=('alex',18,'male','x','y') kwargs={} # # # test2('alex',18,gender='male') # # test1('alex',18,'male')
八、验证功能的装饰器
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_dic={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): if current_dic['username'] and current_dic['login']: res = func(*args, **kwargs) return res username=input('用户名:').strip() passwd=input('密码:').strip() for user_dic in user_list: if username == user_dic['name'] and passwd == user_dic['passwd']: current_dic['username']=username current_dic['login']=True res = func(*args, **kwargs) return res else: print('用户名或者密码错误') return wrapper @auth_func def index(): print('欢迎来到京东主页') @auth_func def home(name): print('欢迎回家%s' %name) @auth_func def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) print('before-->',current_dic) index() print('after--->',current_dic) home('产品经理') # shopping_car('产品经理')
九、带参数验证功能的装饰器
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_dic={'username':None,'login':False} def auth(auth_type='filedb'): def auth_func(func): def wrapper(*args,**kwargs): print('认证类型是',auth_type) if auth_type == 'filedb': if current_dic['username'] and current_dic['login']: res = func(*args, **kwargs) return res username=input('用户名:').strip() passwd=input('密码:').strip() for user_dic in user_list: if username == user_dic['name'] and passwd == user_dic['passwd']: current_dic['username']=username current_dic['login']=True res = func(*args, **kwargs) return res else: print('用户名或者密码错误') elif auth_type == 'ldap': print('鬼才特么会玩') res = func(*args, **kwargs) return res else: print('鬼才知道你用的什么认证方式') res = func(*args, **kwargs) return res return wrapper return auth_func @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index) def index(): print('欢迎来到京东主页') @auth(auth_type='ldap') def home(name): print('欢迎回家%s' %name) # @auth(auth_type='sssssss') def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) # print('before-->',current_dic) # index() # print('after--->',current_dic) # home('产品经理') shopping_car('产品经理')

浙公网安备 33010602011771号