1、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time
time.strftime('%Y-%m-%d %X')
import time
from functools import wraps
def log_w_outter(filepath):
def log_w(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
with open(filepath,'a',encoding='utf-8') as f:
log = time.strftime('%Y-%m-%d %H:%M:%S {} run' .format(func.__name__))
f.write(log+'\n')
return res
return wrapper
return log_w
@log_w_outter(filepath='day14.txt')
def f1():
print("from f1")
f1()
2、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
字符串
s = 'Let life be beautiful like summer flowers and death like autumn leaves'
s_iter = iter(s)
while True:
try:
print(next(s_iter))
except StopIteration:
break
列表
l = [1,2,3,4,5]
l_iter = iter(l)
while True:
try:
print(next(l_iter))
except StopIteration:
break
元组
t = (1,2,3,4)
t_iter = iter(t)
while True:
try:
print(next(t_iter))
except StopIteration:
break
字典
d = {'k1':1,'k2':2,'k3':3}
d_iter = iter(d)
while True:
try:
res = next(d_iter)
print(res)
print(d[res])
except StopIteration:
break
集合
set1 = {1,2,3,4}
set1_iter = set1.__iter__()
while True:
try:
print(next(set1_iter))
except StopIteration:
break
文件对象
with open('a.txt') as f:
while True:
try:
print(next(f))
except StopIteration:
break
3、自定义迭代器实现range功能
def new_range(start = None,end = None,step = 1):
if start != None and end == None:
n = start
start = 0
end = n
while start < end:
yield start
start += step
else:
while start < end:
yield start
start += step
for i in new_range(1,100,2):
print(i)
==================== 本周选做作业如下 ====================
编写小说阅读程序实现下属功能
一:程序运行开始时显示
0 账号注册
1 登录功能
2 充值功能
3 阅读小说
二:完成下述功能
2.1、账号注册
- 针对文件db.txt,内容格式为:"用户名:密码:金额" 完成注册功能
2.2、充值功能
三:文件story_class.txt存放类别与小说文件路径,如下,读出来后可用eval反解出字典
{"0":{"0":["倚天屠狗记.txt",3],"1":["沙雕英雄转.txt",10]},"1":{"0":["令人羞耻的爱.txt",6],"1":["二狗的妻子与大草原的故事.txt",5]},}
3.1、用户登录成功后显示如下内容,根据用户选择,显示对应品类的小说编号、小说名字、以及小说的价格
"""
0 玄幻武侠
1 都市爱情
2 高效养猪36技
"""
3.2、用户输入具体的小说编号,提示是否付费,用户输入y确定后,扣费并显示小说内容,如果余额不足则提示余额不足
四:为功能2.2、3.1、3.2编写认证功能装饰器,要求必须登录后才能执行操作
五:为功能2.2、3.2编写记录日志的装饰器,日志格式为:"时间 用户名 操作(充值or消费) 金额"
附加:
可以拓展作者模块,作者可以上传自己的作品
from functools import wraps
def login_auth(func):
def inner(*args,**kwargs):
global login_user
if login_user:
res = func(*args,**kwargs)
return res
else:
print('您还未登录,请先登录')
login()
return inner
def gold_log(func):
def inner(*args,**kwargs):
global login_user
import time
res = func(*args,**kwargs)
if func.__name__ == 'recharge':
order = '充值'
else:
order = '消费'
with open('gold_log.txt','a',encoding='utf-8') as f:
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
f.write(f"{now_time} {login_user} {order} {res}\n")
return res
return inner
def register():
while True:
inp_name = input("请输入您注册的账号:").strip()
inp_pwd = input("请输入您的密码:").strip()
repeat_pwd = input("请确认您的密码:").strip()
if inp_pwd != repeat_pwd:
print("两次输入的密码不同,请重新输入!")
continue
else:
with open('db.txt',mode='r',encoding='utf-8') as read_f,\
open('db.txt',mode='a',encoding='utf-8') as write_f:
for line in read_f:
list = line.strip('\n').split(':')
if inp_name == list[0]:
print("用户名已存在,请重新输入!")
break
else:
write_f.write(f'{inp_name}:{inp_pwd}:{0}\n')
print("注册成功!")
return
def login():
global login_user
num = 0
while num < 3:
inp_name = input("请输入您的用户名:").strip()
inp_pwd = input("请输入您的密码:").strip()
with open('db.txt',mode='r',encoding='utf-8') as f:
for line in f:
list = line.strip('\n').split(':')
if inp_name == list[0]:
if inp_pwd == list[1]:
print("登录成功")
login_user = inp_name
num = 3
break
else:
print("密码错误")
num += 1
else:
print("用户名不存在")
num += 1
@login_auth
@gold_log
def recharge():
global login_user
import os
inp_gold = input("请输入您要充值的金额:").strip()
with open('.db.txt.swap',mode='w',encoding='utf-8') as write_f,\
open('db.txt',mode='r',encoding='utf-8') as read_f:
lines = read_f.readlines()
num = 0
for line in lines:
if login_user in line:
list = line.strip("\n").split(':')
old_gold = int(list[2])
new_gold = old_gold + int(inp_gold)
line = line.replace(str(old_gold),str(new_gold))
write_f.write(line)
num += 1
print("充值成功")
break
write_f.write(line)
num += 1
for i in range(num, len(lines)):
write_f.write(lines[i])
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
return inp_gold
@gold_log
def reduce_money(reduce_gold):
global login_user
import os
with open('.db.txt.swap',mode='w',encoding='utf-8') as write_f,\
open('db.txt',mode='r',encoding='utf-8') as read_f:
lines = read_f.readlines()
num = 0
for line in lines:
if login_user in line:
list = line.strip("\n").split(':')
old_gold = int(list[2])
new_gold = old_gold - int(reduce_gold)
line = line.replace(str(old_gold),str(new_gold))
write_f.write(line)
num += 1
break
write_f.write(line)
num += 1
for i in range(num, len(lines)):
write_f.write(lines[i])
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
return reduce_gold
@login_auth
def read():
for k,v in d_story_sort.items():
print(k,v)
inp_sort = input("请输入您想查阅的书籍类型:").strip()
if inp_sort in d_story:
print('----------------------')
d_book = d_story.get(inp_sort)
for k in d_book.keys():
print(f"编号:{k} 书名:{d_book.get(k)[0]} 价格:{d_book.get(k)[1]}")
inp_book = input("请输入您要购买的书籍编号:").strip()
if inp_book in d_book:
inp_buy = input("确认购买请输入y:")
if inp_buy == 'y' or inp_buy == 'Y':
reduce_money(d_book.get(inp_book)[1])
print("购买成功")
else:
print("购买失败")
else:
print("不存在该分类")
@login_auth
def inser_book():
book_name = input("请输入您要上传的书籍:").strip()
import os
with open('writer.txt','r',encoding='utf-8') as read_f,\
open('.writer.txt.swap','w',encoding='utf-8') as writer_f:
if login_user in d_writer:
old = d_writer.get(login_user)
print(str(old))
d_writer.get(login_user).append(book_name)
new = d_writer.get(login_user)
print(str(new))
print(d_writer)
writer_f.write(str(d_writer))
# num = 0
# lines = read_f.readlines()
# for line in lines:
# if login_user in line:
# line = line.replace(str(old),str(new))
# print(line)
# writer_f.write(line)
# num += 1
# break
# writer_f.write(line)
# num += 1
# for i in range(num,len(lines)):
# writer_f.write(lines[i])
os.remove('writer.txt')
os.rename('.writer.txt.swap','writer.txt')
print("添加成功")
# pass
d = {
'0':[register,'账号注册'],
'1':[login,'登录功能'],
'2':[recharge,'充值功能'],
'3':[read,'阅读小说'],
'4':[inser_book,'上传作品']
}
d_story_sort = {
0:'玄幻武侠',
1:'都市爱情',
2:'高效养猪36技'
}
with open('writer.txt','r',encoding='utf-8') as writer_f:
d_writer = eval(writer_f.read())
with open('story_class.txt','r',encoding='utf-8') as story_f:
story_data = story_f.read()
d_story = eval(story_data)
login_user = None
while True:
print("Q 退出程序")
for k in d:
print(f"{k} {d[k][1]}")
inp_order = input("请输入您的指令:").strip()
if inp_order == 'q' or inp_order == 'Q':
break
elif inp_order in d:
d[inp_order][0]()
else:
print("未知的指令")