作业: 1、编写课上讲解的有参装饰器准备明天默写 2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定 注意:时间格式的获取 import time time.strftime('%Y-%m-%d %X') 4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象 5、自定义迭代器实现range功能 ====================本周选做作业如下==================== 编写小说阅读程序实现下属功能 # 一:程序运行开始时显示 0 账号注册 1 充值功能 2 阅读小说 3 作品上传 - 管理员登录 def main(): while True: print(''' 0 账号注册 1 充值功能 2 阅读小说 ''') choice = input('请输入功能编号: ').strip() # 二: 针对文件db.txt,内容格式为:"用户名:密码:金额",完成下述功能 2.1、账号注册 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消费) 金额" # 附加: # 可以拓展作者模块,作者可以上传自己的作品
# 1、编写课上讲解的有参装饰器准备明天默写 # 2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来, # 我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器, # 完成自动添加到字典的操作 # func_dic = {'1': login, '2': register} '''''' ''' func_dic = {} # 有参装饰器 x接收的是用户输入功能对应的编号 def outer(x): # x ---> '1' # 无参装饰器 def wrapper(func): # func --> login, func --> register func_dic[x] = func # {'1': login, '2': register} def inner(*args, **kwargs): res = func(*args, **kwargs) return res return inner return wrapper @outer('1') # ---> @wrapper def login(): pass @outer('2') def register(): pass print(func_dic) ''' # 3、 编写日志装饰器,实现功能如:一旦函数f1执行, # 则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定 # 注意:时间格式的获取 # import time # time.strftime('%Y-%m-%d %X') ''' import time # 给被装饰对象添加执行日志装饰器 def add_log_wrapper(func): def inner(*args, **kwargs): # 在被装饰对象调用前的操作 # 1) 将被装饰对象的执行日志 写入 log.txt文件中 with open('log.txt', 'a', encoding='utf-8') as f: now_time = time.strftime('%Y-%m-%d %X') func_name = func.__name__ log_str = f'{now_time} {func_name} run ' print(log_str) f.write(log_str) res = func(*args, **kwargs) # 被装饰对象的调用 # 在被装饰对象调用后的操作 return res return inner @add_log_wrapper def f1(): # time.sleep(10) print('我是f1函数的执行...') @add_log_wrapper def f2(): print('我是f2函数的执行') # f1() f2() ''' # 4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象 ''' def my_iter(obj): # 字符串、列表、元组、字典、集合、文件 # 'tank'.__iter__() iter_obj = obj.__iter__() while True: try: print(iter_obj.__next__()) except StopIteration: break my_iter('tank') ''' # 5、自定义迭代器实现range功能 ''' # res = range(1, 10, 2) # print(res) # print(type(res)) # <class > 都想象成一个迭代器 def my_range(start, end, move=1): # 10-9 while start < end: # print(start) # 1, 3, 5, 7, 9 yield start start += move # start += 2 res1 = range(1, 10, 2) # __str__: range(1, 10, 2) print(res1) # range(1, 10, 2) ---> class range() res2 = my_range(1, 10, 2) # <generator object my_range at 0x10712e410> print(res2) for line in res1: print(line) for line2 in res2: print(line2) '''