Python__装饰器练习题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python__装饰器练习题相关的知识,希望对你有一定的参考价值。
一:编写函数,(函数执行的时间是随机的)
import time def timmer(func): def wrapper(*args,**kwargs): start= time.time() func(*args,**kwargs) stop = time.time() print(‘执行时间是%s‘%(stop-start)) return wrapper @timmer def exe(): print(‘你愁啥!‘) exe()
二:编写装饰器,为函数加上统计时间的功能
import time def timmer(func): def wrapper(*args,**kwargs): start= time.time() func(*args,**kwargs) stop = time.time() print(‘执行时间是%s‘%(stop-start)) return wrapper @timmer def exe(): print(‘你愁啥!‘) exe()
三:编写装饰器,为函数加上认证的功能
def auth(func): def wrapper(*args,**kwargs): name = input(‘请输入你的名字>>: ‘).strip() password = input(‘请输入你的密码>>: ‘).strip() if name == ‘egon‘ and password == ‘123‘: func(*args,**kwargs) return wrapper @auth def my_log(name): print(‘%s欢迎登陆‘%(name)) my_log(‘egon‘)
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval(‘{"name":"egon","password":"123"}‘)转成字典格式
current_user = {‘name‘:None} def auth(func): def wrapper(*args,**kwargs): if current_user[‘name‘]: func(*args, **kwargs) else: name = input(‘请输入你的用户名>>: ‘).strip() password = input(‘请输入你的密码>>: ‘).strip() with open(‘登录文件.txt‘,‘r‘,encoding = ‘utf-8‘) as f: line = f.readline() my_dic = eval(line) if name == my_dic[‘name‘] and password == my_dic[‘password‘]: func(*args,**kwargs) current_user[‘name‘] = name else: print(‘your input not exists‘) return wrapper @auth def my_log(): print(‘this is my_log‘) @auth def my_name(): print(‘欢迎登陆‘) my_log() my_name()
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
import time,random user={‘user‘:None,‘login_time‘:None,‘timeout‘:0.000003,} def timmer(func): def wrapper(*args,**kwargs): s1=time.time() res=func(*args,**kwargs) s2=time.time() print(‘%s‘ %(s2-s1)) return res return wrapper def auth(func): def wrapper(*args,**kwargs): if user[‘user‘]: timeout=time.time()-user[‘login_time‘] if timeout < user[‘timeout‘]: return func(*args,**kwargs) name=input(‘name>>: ‘).strip() password=input(‘password>>: ‘).strip() if name == ‘egon‘ and password == ‘123‘: user[‘user‘]=name user[‘login_time‘]=time.time() res=func(*args,**kwargs) return res return wrapper @auth def index(): time.sleep(random.randrange(3)) print(‘welcome to index‘) @auth def home(name): time.sleep(random.randrange(3)) print(‘welcome %s to home ‘ %name) index() home(‘egon‘)
六:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
import requests def my_down(url = ‘https://www.baidu.com‘): def get(): return requests.get(url).text return get baidu_web = my_down() print(baidu_web())
七:为题目五编写装饰器,实现缓存网页内容的功能:
具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
扩展功能:用户可以选择缓存介质/缓存引擎,针对不同的url,缓存到不同的文件中
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 @make_cache def get(url): return requests.get(url).text
八:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,
我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
route_dic={} def make_route(name): def deco(func): route_dic[name]=func return deco @make_route(‘select‘) def func1(): print(‘select‘) @make_route(‘insert‘) def func2(): print(‘insert‘) @make_route(‘update‘) def func3(): print(‘update‘) @make_route(‘delete‘) def func4(): print(‘delete‘) print(route_dic)
九 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime(‘%Y-%m-%d %X‘)
import time,os def auth(logfile): def deco(func): if not os.path.exists(logfile): with open(logfile,‘w‘,encoding = ‘utf-8‘) as f: pass def wrapper(*args,**kwargs): res = func(*args,**kwargs) with open(logfile,‘a‘,encoding = ‘utf-8‘) as f: f.write(‘%s %s run‘%(time.strftime(‘%Y-%m-%d %X‘),func.__name__)) return wrapper return deco @auth(‘suhao.txt‘) def index(): print(‘this is my index‘) index()
以上是关于Python__装饰器练习题的主要内容,如果未能解决你的问题,请参考以下文章