作业10
一、编写函数(函数的执行时间是随机的)
import random,time
def random_time():
print('start')
time.sleep(random.randint(1,10))
print('end')
random_time()
二、编写装饰器,为函数加上统计时间的功能
import time
def timmer(func):
def wrapper(*args,**kwargs):
star = time.time()
res = func(*args,**kwargs)
stop = time.time()
print('run time is %s'%(stop - star))
print(res)
return res
return wrapper()
@timmer
def index()
time.sleep(3)
print('welecome to Oldboy school')
index()
三、编写装饰器,为用户加上认证功能
def auth(func):
def wrapper(*args,**kwargs):
user = input('please input your username>>>: ').strip()
pwd = input('please input your password>>>: ').strip()
if user == 'klf' and pwd == '123':
print('login successful')
res = func(*args,**kwargs)
return res
else:
print('user or password error')
return wrapper()
四、编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无需在输入账户密码
from functools import wraps
user_info = {'user':None}
def auth(func):
@wraps
def wrapper(*args,**kwargs):
if user_info['user'] is not None:
res = func(*args,**kwargs)
return res
user = input('please input your username>>>: ').strip()
pwd = input('please input your password>>>: ').strip()
with open('user_info.txt') as f:
for line in f:
line = line.strip('\n').split(':')
if line[0] == user and line[1] == pwd:
print('login successful')
res = func(*args,**kwargs)
return res
else:
print('user or password error')
return wrapper()
@auth
def cut():
print('welecome to Oldboy school')
五、编写装饰器,为多个函数加上认证功能,要求登陆成功一次,在超时时间内无需重复登陆,过了超时时间则必须重新登陆。
import time,random
user = {'user':None,'login_time':None,'timeout':0.0003} #定义空字典,将用户名,登录时间存为None,定义一个超时的值
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('please input your name >>: ').strip()
pwd = input('please input your password>>: ').strip()
if name == 'egon' and pwd == '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('welecome to Shanghai')
@auth
def home(name):
time.sleep(random.randrange(3))
print('welecome to %s home'%name)
index()
home('egon')
六、编写下载网页内容的函数,要求功能:用户输入一个url,函数返回下载页面的结果
import requests # 导入requests模块
def get(url): # 定义函数
response = requests.get(url) # 爬取网址url的内容
if response.status_code == 200: # 判断状态
return response.text
url = input('>>:')
print(get(url))
七、为题目五编写装饰器,实现缓存网页内容的功能
具体实现:实现下载的页面存放与文件中,如果文件内有值(文件大小不为于0),就优先从文件中读取网页内容,否则,就去网页下载,然后存到文件中
import requests
from functools import wraps
def download(func):
@wraps(func)
def wrapper(*args,**kwargs):
with open(db,mode='a+',encoding='utf-8') as f:
f.seek(0)
if len(f.read()) > 0:
f.seek(0)
res = f.read()
return res
else:
res = func(*args,**kwargs)
f.write(res)
return res
return wrapper
@download
def get(url, db): # 爬取一个网页的内容
response = requests.get(url)
if response.status_code == 200:
return response.text
url = input('URL>>: ')
db = input('File path>>: ')
get(url,db)
八、还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的想法,在文件开头声明一个字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
from functools import wraps
functions = {} # 定义空字典方便将函数放进去
def add(func):
@wraps(func) # 这一步会令装饰器变得完美
def wrapper(*args, **kwargs):
for i in functions: # 循环字典,判断func是否已经存在
if functions[i] == func:
break
else: # 遍历字典没找到func则将func添加进字典
functions[str(len(functions))] = func # 添加时要与数字建立关系
res = func(*args, **kwargs)
return res
return wrapper
@add
def login():
print('Log in successful')
@add
def shopping():
print("I'm shopping now")
@add
def pay():
print("Pay for goods")
@add
def charge():
print('Charge money')
九、编写日志装饰器,实现功能如:一旦函数f1执行,则将消息的具体时间写入日志中,日志文件路径可以指定
from functools import wraps
import time
def f1(file_path):
def f2(func ):
@wraps(func)
def f3(*args,**kwargs):
with open(file_path,'a',encoding='utf-8') as f:
time_now = time.strftime('%Y-%m-%d %X')
res = func(*args,**kwargs)
f.write('%s:%s:run\n'%(time_now,func))
return res
return f3
return f2
@f1('f1.txt')
def f4():
pass

浙公网安备 33010602011771号