day15

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。