作业14
一:编写函数,(函数执行的时间用time.sleep(n)模拟)
import time
def du():
print("嘟嘟喂嘟嘟")
time.sleep(2)
二:编写装饰器,为函数加上统计时间的功能
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
stop_time = time.time()
print("程序运行时间为{}".format(stop_time-start_time))
return res
return wrapper
@ timmer
def du():
print("嘟嘟喂嘟嘟")
time.sleep(2)
du()
三:编写装饰器,为函数加上认证的功能
import time
def identify(func):
def wrapper(*args,**kwargs):
inp_user = input("请输入用户名:")
inp_password = input("请输入密码:")
with open("user_info.txt","r",encoding="utf-8") as f:
for line in f:
user,password = line.strip().split(":")
if user == inp_user and password == inp_password:
print("登录成功")
break
elif user == inp_user and password != inp_password:
print("密码错误")
return
else:
print("用户名不存在")
return
res = func(*args,**kwargs)
return res
return wrapper
@ identify
def du():
print("嘟嘟喂嘟嘟")
time.sleep(2)
du()
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,
可以用eval('{"name":"egon","password":"123"}')转成字典格式
import time
online_user = None
def identify(func):
def wrapper(*args, **kwargs):
global online_user
if not online_user:
inp_user = input("请先登录,输入用户名:")
inp_password = input("请输入密码:")
with open("user_info_dict.txt", "r", encoding="utf-8") as f:
for line in f:
user_dict = eval(line.strip())
if user_dict.get("name") == inp_user and user_dict.get("password") == inp_password:
print("登录成功")
online_user = inp_user
break
elif user_dict.get("name") == inp_user and user_dict.get("password") != inp_password:
print("密码错误")
return
else:
print("用户名不存在")
return
res = func(*args, **kwargs)
return res
return wrapper
@identify
def du():
print("DJ,开始")
print("嘟嘟~嘟嘟~
嘟嘟喂嘟嘟")
time.sleep(2)
@identify
def efs():
print("DJ,开始")
print("857~
857!")
du()
efs()
五:编写装饰器,为多个函数加上认证功能,
要求登录成功一次,在超时时间内无需重复登录,
超过了超时时间,则必须重新登录
import time
online_user = None
online_time = 0
def identify(func):
def wrapper(*args, **kwargs):
global online_user, online_time
now_time = time.time()
if not (online_user and now_time - online_time <= 180):
inp_user = input("请先登录,输入用户名:")
inp_password = input("请输入密码:")
with open("user_info_dict.txt", "r", encoding="utf-8") as f:
for line in f:
user_dict = eval(line.strip())
if user_dict.get("name") == inp_user and user_dict.get("password") == inp_password:
print("登录成功")
online_user = inp_user
online_time = time.time()
break
elif user_dict.get("name") == inp_user and user_dict.get("password") != inp_password:
print("密码错误")
return
else:
print("用户名不存在")
return
res = func(*args, **kwargs)
return res
return wrapper
@identify
def du():
print("DJ,开始")
print("嘟嘟~嘟嘟~
嘟嘟喂嘟嘟")
time.sleep(2)
@identify
def efs():
print("DJ,开始")
print("857~
857!")
time.sleep(2)
du()
print(time.time())
efs()
print(time.time())
time.sleep(176)
print(time.time())
du()
print(time.time())
du()
print(time.time())
六:选做题
思考题(选做),叠加多个装饰器,
加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
@deco1 # index=deco1(deco2.wrapper的内存地址)
@deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
@deco3 # deco3.wrapper的内存地址=deco3(index)
def index():
pass
import time
def deco1(func):
def wrapper(*args, **kwargs):
start_time = time.time()
print("1开始", start_time)
res = func(*args, **kwargs)
stop_time = time.time()
print("1结束", stop_time)
return res
return wrapper
def deco2(func):
def wrapper(*args, **kwargs):
start_time = time.time()
print("2开始", start_time)
res = func(*args, **kwargs)
stop_time = time.time()
print("2结束", stop_time)
return res
return wrapper
def deco3(func):
def wrapper(*args, **kwargs):
start_time = time.time()
print("3开始", start_time)
res = func(*args, **kwargs)
stop_time = time.time()
print("3结束", stop_time)
return res
return wrapper
@deco1
@deco2
@deco3
def test():
print("执行test")
test()
1