day12作业

一:编写函数,(函数执行的时间是随机的)
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()













 
原文地址:https://www.cnblogs.com/msj513/p/9714423.html