python学习17——课后练习

# # 一:编写函数,(函数执行的时间用time.sleep(n)模拟)
import time


def sum(x, y):
sum = x + y
time.sleep(3)
print(sum)
return sum

# # 二:编写装饰器,为函数加上统计时间的功能
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res

return wrapper


sum = timer(sum)
sum(1,2)
'''
3
3.0039072036743164
'''


# 三:编写装饰器,为函数加上认证的功能
def auth(func):
def wrapper(*args,**kwargs):
inp_name = input('请输入名字')
inp_psd = input('请输入密码')
with open('db.txt','rt',encoding='utf-8')as rf:
info={}
for line in rf:
name,psd = line.strip().split(':')
info[name]=psd
if inp_name not in info:
print('用户不存在')
if inp_name in info and inp_psd==info[inp_name]:
print('登陆成功')
# 执行之前的sum函数
res = func(*args,**kwargs)
return res
else:
print('登录失败')
return wrapper
sum =auth(sum)
sum(1,2)
'''
结果:
请输入名字xilou
请输入密码666
登陆成功
3
3.0051000118255615
'''

# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
userstaus={'username':None}#用于保存用户登录状态
def auth_one(func):
def wrapper(*args,**kwargs):
#如果用户未登陆则登陆再使用
if userstaus['username'] is None:
inp_name = input('请输入名字')
inp_psd = input('请输入密码')
with open('db.txt','rt',encoding='utf-8')as rf:
info={}
for line in rf:
name,psd = line.strip().split(':')
info[name]=psd
if inp_name not in info:
print('用户不存在')
if inp_name in info and inp_psd==info[inp_name]:
print('登陆成功')
#记录下当前用户的登录状态
userstaus['username']=inp_name
#执行之前的sum函数
res = func(*args,**kwargs)
return res
else:
print('登录失败')
else:
# 若之前已登录则直接进行功能使用
print('欢迎回来,亲爱的{}用户'.format(userstaus['username']))
res = func(*args, **kwargs)
return res
return wrapper
sum =auth(sum)
sum(1,2)
sum(2,3)
sum(2,5)
'''
结果:
请输入名字xilou
请输入密码666
登陆成功
3
欢迎回来,亲爱的xilou用户
5
欢迎回来,亲爱的xilou用户
7

Process finished with exit code 0
'''
# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
import time
userstaus={'username':None,'login_time':0}#用于保存用户登录状态
def auth_time(func):
def wrapper(*args,**kwargs):
#若用户登录时间超过5秒则取消登录状态,即退出该用户的登录
start=time.time()
if start-userstaus['login_time']>5:
userstaus['username']=None
#如果用户未登陆则登陆再使用
if userstaus['username'] is None:
inp_name = input('请输入名字')
inp_psd = input('请输入密码')
with open('db.txt','rt',encoding='utf-8')as rf:
info={}
for line in rf:
name,psd = line.strip().split(':')
info[name]=psd
if inp_name not in info:
print('用户不存在')
if inp_name in info and inp_psd==info[inp_name]:
print('登陆成功')
#记录下当前用户的登录状态
userstaus['username']=inp_name
# 记录下用户登录的时间
userstaus['login_time']=time.time()
#执行之前的sum函数
res = func(*args,**kwargs)
return res
else:
print('登录失败')
else:
# 若之前已登录则直接进行功能使用
print('欢迎回来,亲爱的{}用户'.format(userstaus['username']))
res = func(*args, **kwargs)
return res
return wrapper
sum =auth(sum)
sum(1,2)
sum(2,3)
sum(2,5)
sum(2,5)
'''
结果:
请输入名字xilou
请输入密码666
登陆成功
3
欢迎回来,亲爱的xilou用户
5
请输入名字xilou
请输入密码666
登陆成功
7
欢迎回来,亲爱的xilou用户
7

Process finished with exit code 0
'''
# 六:选做题
# # 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
# # @deco1 # index=deco1(deco2.wrapper的内存地址)
# # @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
# # @deco3 # deco3.wrapper的内存地址=deco3(index)
# # def index():
# # pass
@timer
@auth_time
def sum(x, y):
sum = x + y
time.sleep(3)
print(sum)
return sum

sum(1,2)
sum(2,2)
sum(2,3)

猜你喜欢

转载自www.cnblogs.com/heirenxilou/p/12552099.html