作业 3月24日

# 作业:
# 1、编写课上讲解的有参装饰器准备明天默写

def auth(db_type):
def otter(func):
def wrapper(*args,**kwargs):
username = input("your name:").strip()
password = input("your pwd:").strip()

if db_type == "file":
print("基于文件的登陆")

if username == "Anna" and password == "123":
res = func(*args,**kwargs)
return res
else:
print("password wrong")
elif db_type == 'file':
print("文件file")
elif db_type == "mysql":
print("数据库mysql")
elif db_type == "ldap":
print("基于ldap")
else:
print("wrong")
return wrapper
return otter


@auth(db_type="file")
def index(x,y):
print("index %s %s"%(x,y))

@auth(db_type="mysql")
def home(name):
print("home>>>"%name)

@auth(db_type="ladp")
def transfer():
print("transfer>>>"%transfer)


index(11,22)
home("Anna")
transfer()

# 2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,
# 然后在每个函数前加上装饰器,完成自动添加到字典的操作
d = {}
key = 0
def add_dict(func):
def wrapper(*args,**kwargs):
global key
d["{}".format(key)] = func
key += 1
return wrapper

@add_dict
def index(x,y):
print("index %s %s"%(x,y))
@add_dict
def home():
pass
index(11,22)


# 3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
# 注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time

from functools import wraps
src = None
def access_log(func):
@wraps(func)
def wrapper(*args,**kwargs):
global src
if not src:
inp_src = input("请指定保存路径:").strip()
src = inp_src
func_name = func()
if func_name:
with open(r"{}access.log".format(src),'a',encoding="utf-8") as f:
f.write("{} {}run ".format(time.strftime("%Y-%m_%d %x"),func_name))
return wrapper

@access_log
def test1():
time.sleep(1)
print("test1执行完毕")
return test1.__name__

@access_log
def test2():
time.sleep(1)
return test2.__name__
@access_log
def test3():
time.sleep(1)
return test3.__name__

test1()
test2()
test3()
# 4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
def wrpper(inp_type):
print("this is {}".format(type(inp_type)))
while True:
try:
print(next(inp_type))
except StopIteration:
break
wrpper("123".__iter__())
wrpper([1,2,3].__iter__())
wrpper((1,2,3).__iter__())
wrpper({"k1":1,"k2":2}.__iter__())
wrpper({1,2,3}.__iter__())
with open('access.log',"r",encoding="utf-8") as f:
wrpper(f.__iter__())

# 5、自定义迭代器实现range功能
def my_range(start,stop,step=1):
while start < stop:
start += step
yield start
for i in my_range(1,10,2):
print(i)


# ====================本周选做作业如下====================
# 编写小说阅读程序实现下属功能
# # 一:程序运行开始时显示
# 0 账号注册
# 1 充值功能
# 2 阅读小说



# # 二: 针对文件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消费) 金额"
#
#
#
# # 附加:
# # 可以拓展作者模块,作者可以上传自己的作品
原文地址:https://www.cnblogs.com/acnjanna2019/p/12561363.html