作业15
1、编写课上讲解的有参装饰器准备明天默写
def auth(db_type):
def deco(func):
def wrapper(*args, **kwargs):
name = input("请输入用户名:")
password = input("请输入密码:")
if db_type == "file":
print("基于file验证(open,for line in f)")
with open("db.txt", "r", encoding="utf-8") as f:
for line in f:
user, pwd = line.strip().split(":")
if user == name and pwd == password:
print("登陆成功")
res = func(*args, **kwargs)
return res
else:
print("账号名或密码错误")
elif db_type == "mysql":
print("基于mysql验证")
elif db_type == "ldap":
print("基于ldap验证")
else:
print("不支持该类型")
return wrapper
return deco
@auth("file")
def index():
print("欢迎到index页面")
index()
@auth("mysql")
def index():
print("欢迎到index页面")
index()
@auth("ldap")
def index():
print("欢迎到index页面")
index()
2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
# 效果:
# func_dic = {
# "0": ["退出", exit],
# "1": ["登录", login],
# "2": ["注册", logon],
# "3": ["提现", with_draw],
# "4": ["查询余额", check_balance],
# "5": ["转账", transfer]
# }
func_dict={}
def func_dic_gen(func):
def wrapper(*args,**kwargs):
for value in func_dict.values():
if func.__name__ in value:
break
else:
count = str(len(func_dict))
func_dict[count]=["{}".format(func.__name__), func]
res = func(*args,**kwargs)
return res
return wrapper
@func_dic_gen
def index(x, y):
print('index->>%s:%s' % (x, y))
@func_dic_gen
def home(name):
print('home->>%s' % name)
@func_dic_gen
def transfer():
print('transfer')
index(1,2)
home("wu")
transfer()
print(func_dict)
3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time
def log(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
func_time = time.strftime('%Y-%m-%d %X')
print(func_time)
with open("log.txt", "a", encoding="utf-8") as f:
f.write("{} {} run
".format(func_time, func.__name__))
return res
return wrapper
@log
def f1():
print("f1已执行")
f1()
4、基于迭代器的方式,用while循环迭代取值
字符串、列表、元组、字典、集合、文件对象
def my_for(obj):
obj_iter = obj.__iter__()
while 1:
try:
print(obj_iter.__next__(), end=" ")
except StopIteration:
print("")
break
my_for("wqd1")
my_for([1, 2, 4, 5])
my_for({1, 2, 4, 5})
my_for((1, 2, 4, 5))
my_for({"name": 1, "age": 2, "sex": 4, "ga": 5})
5、自定义迭代器实现range功能
# print(range(1,7,2)) # range(1, 7, 2) 1,3,5
def my_range(start,end,step=1):
while start < end:
yield start
start += step
# my = range(2,7)
my = my_range(0,7)
for i in my:
print(i)
1