day15

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("未知的指令")

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末探遵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妓柜,更是在濱河造成了極大的恐慌箱季,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍掐,死亡現(xiàn)場離奇詭異藏雏,居然都是意外死亡,警方通過查閱死者的電腦和手機作煌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門掘殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粟誓,你說我怎么就攤上這事奏寨。” “怎么了鹰服?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵病瞳,是天一觀的道長。 經(jīng)常有香客問我悲酷,道長套菜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任设易,我火速辦了婚禮逗柴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顿肺。我一直安慰自己戏溺,他們只是感情好渣蜗,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著于购,像睡著了一般袍睡。 火紅的嫁衣襯著肌膚如雪知染。 梳的紋絲不亂的頭發(fā)上肋僧,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音控淡,去河邊找鬼嫌吠。 笑死,一個胖子當(dāng)著我的面吹牛掺炭,可吹牛的內(nèi)容都是我干的辫诅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼涧狮,長吁一口氣:“原來是場噩夢啊……” “哼炕矮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起者冤,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肤视,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涉枫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邢滑,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年愿汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了困后。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡衬廷,死狀恐怖摇予,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吗跋,我是刑警寧澤侧戴,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站小腊,受9級特大地震影響救鲤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秩冈,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一本缠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧入问,春花似錦丹锹、人聲如沸稀颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾灶。三九已至,卻和暖如春租漂,著一層夾襖步出監(jiān)牢的瞬間阶女,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工哩治, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秃踩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓业筏,卻偏偏與公主長得像憔杨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒜胖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359