# 1、编写课上讲解的有参装饰器准备明天默写
def auth(db_type): def deco(func): def wrapper(*args,**kwargs): name = input('your name>>>: ').strip() pwd = input('your password>>>: ').strip() if db_type == 'file': print('基于文件的验证') if name == 'egon' and pwd == '123': res = func(*args, **kwargs) return res elif db_type == 'mysql': print('基于mysql的验证') elif db_type == 'ldap': print('基于ldap的验证') else: print('不支持该db_type') return wrapper return deco @auth(db_type='file') def index(x,y): print('index>>>%s %s'%(x,y)) @auth(db_type='mysql') def home(name): print(name) @auth(db_type='ldap') def transfer(): print('transfer')
2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
dic = {} def add_dic(key,value): def outter(func): def wrapper(*args,**kwargs): dic[key]=value res = func(*args,**kwargs) return res return wrapper return outter @add_dic('1',['login','登入']) def login(): pass @add_dic('2',['regist','注册']) def regist(): pass @add_dic('3',['check_money','查询余额']) def check_money(): pass login() regist() check_money() print(dic)
3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
import time src = None def ouutar(func): def wrapper(*args,**kwargs): global src if src == None: inp_src = input('输入文件路径') src = inp_src res = func(*args,**kwargs) with open(inp_src,'at',encoding='utf-8') as f: f.write('{} f1 run'.format(time.strftime('%Y-%m-%d %X'))) print('写入成功') return res return wrapper @ouutar def f1(): pass f1()
4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
def a(obj_iterator): while True: try: print(obj_iterator.__next__()) except StopIteration: break a('123'.__iter__()) a([1,2,3].__iter__()) a({1:'a',2:'b'}.__iter__()) a((1,2,3).__iter__()) a({1,2,3}.__iter__()) with open('a.txt','rt',encoding='utf-8')as f: a(f.__iter__())
5、自定义迭代器实现range功能
def my_range(start, stop, step=1): while start < stop: yield start start += step for i in my_range(0,5): print(i)