1篮撑、 編寫日志裝飾器减细,實現(xiàn)功能如:一旦函數(shù)f1執(zhí)行,則將消息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循環(huán)迭代取值字符串质欲、列表树埠、元組、字典嘶伟、集合怎憋、文件對象
字符串
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、自定義迭代器實現(xiàn)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)
==================== 本周選做作業(yè)如下 ====================
編寫小說閱讀程序?qū)崿F(xiàn)下屬功能
一:程序運行開始時顯示
0 賬號注冊
1 登錄功能
2 充值功能
3 閱讀小說
二:完成下述功能
2.1九昧、賬號注冊
- 針對文件db.txt绊袋,內(nèi)容格式為:"用戶名:密碼:金額" 完成注冊功能
2.2、充值功能
三:文件story_class.txt存放類別與小說文件路徑铸鹰,如下,讀出來后可用eval反解出字典
{"0":{"0":["倚天屠狗記.txt",3],"1":["沙雕英雄轉(zhuǎn).txt",10]},"1":{"0":["令人羞恥的愛.txt",6],"1":["二狗的妻子與大草原的故事.txt",5]},}
3.1癌别、用戶登錄成功后顯示如下內(nèi)容,根據(jù)用戶選擇蹋笼,顯示對應(yīng)品類的小說編號展姐、小說名字躁垛、以及小說的價格
"""
0 玄幻武俠
1 都市愛情
2 高效養(yǎng)豬36技
"""
3.2、用戶輸入具體的小說編號圾笨,提示是否付費教馆,用戶輸入y確定后,扣費并顯示小說內(nèi)容擂达,如果余額不足則提示余額不足
四:為功能2.2土铺、3.1、3.2編寫認(rèn)證功能裝飾器板鬓,要求必須登錄后才能執(zhí)行操作
五:為功能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("請確認(rèn)您的密碼:").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("確認(rèn)購買請輸入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:'高效養(yǎng)豬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("未知的指令")