一:编写函数,(函数执行的时间是随机的)
import time import random def func1(): i = random.randint(0,10) time.sleep(i) print('func1函数执行完成') func1()
二:编写装饰器,为函数加上统计时间的功能
def comp_time(func): def wrapper(*args,**kwargs): start=time.time() res = func(*args,**kwargs) stop=time.time() print(stop-start) return res return wrapper
三:编写装饰器,为函数加上认证的功能
1 user_info ={'current_user':None} 2 def auth(func): 3 def wrapper(*args,**kwargs): 4 if not user_info['current_user'] is None: 5 print('login successful') 6 res = func1() 7 else: 8 inp_name = input('name>>>:').strip() 9 inp_pwd = input('password>>>:').strip() 10 if inp_name == 'msj' and inp_pwd =='123': 11 print('login successful') 12 user_info['current_user']=inp_name 13 res = func(*args,**kwargs) 14 else: 15 print('username or password error') 16 return res 17 return wrapper
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
1 user_info ={'current_user':None} 2 def login(func): 3 def wrapper(*args,**kwargs): 4 if user_info['current_user'] is not None: 5 print('login successful') 6 res = func() 7 return res 8 else: 9 inp_name = input('name>>>:').strip() 10 inp_pwd =input('password').strip() 11 with open(r'db.txt',mode='r',encoding='utf-8') as rf: 12 for line in rf: 13 dic = eval(line.strip(' ')) 14 if inp_name == dic['name'] and inp_pwd == dic['password']: 15 print('login successful') 16 user_info['current_user'] = inp_name 17 res =func() 18 return res 19 else: 20 print('name or password error') 21 return wrapper
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
1 import time 2 user_inf={'name':None,'start':None} 3 def outter(func): 4 def wrapper(*args,**kwargs): 5 if user_inf['start'] is None : 6 inp_name = input('name>>>:').strip() 7 inp_pwd = input('password>>>:').strip() 8 if inp_name == 'msj' and inp_pwd == '123': 9 print('login succesful') 10 res = func(*args,**kwargs) 11 user_inf['name']=inp_name 12 user_inf['start']=time.time() 13 return res 14 else: 15 print('name or pwd error') 16 elif time.time()-user_inf['start']<3: 17 print('login succesful') 18 res = func(*args, **kwargs) 19 return 20 else: 21 print('登录超时清重新登录') 22 user_inf['name'] = None 23 user_inf['start'] = None 24 25 return wrapper
六:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
import requests def reurl(url): res = requests.get(url) return res.text res = reurl('https://www.baidu.com') print(res)
七:为题目六编写装饰器,实现缓存网页内容的功能:
具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
import requests import os cache_file='cache.txt' def make_cache(func): def wrapper(*args,**kwargs): if not os.path.exists(cache_file): with open(cache_file,'w'):pass if os.path.getsize(cache_file): with open(cache_file,'r',encoding='utf-8') as f: res=f.read() else: res=func(*args,**kwargs) with open(cache_file,'w',encoding='utf-8') as f: f.write(res) return res return wrapper
八:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
dic = {} def indic(name): def wrapper(func): dic[name] = func return wrapper @indic('select') def select(): print('select') @indic('pay') def pay(): print('pay') print(dic)
九 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time def logging(func): def wrapper(*args,**kwargs): res = func() rt = time.strftime('%Y-%m-%d %X') s = rt+' %s run '%(func.__name__) with open('db.txt',mode='a',encoding='utf-8') as wf: wf.write(s) return res return wrapper @logging def f1(): print('f1 run') @logging def f2(): print('f2 run') f1() f2()