python学习17——课后练习

# # 一:编写函数,(函数执行的时间用time.sleep(n)模拟)import timedef 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 wrappersum = timer(sum)sum(1,2)‘‘‘33.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 wrappersum =auth(sum)sum(1,2)‘‘‘结果:请输入名字xilou请输入密码666登陆成功33.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 wrappersum =auth(sum)sum(1,2)sum(2,3)sum(2,5)‘‘‘结果:请输入名字xilou请输入密码666登陆成功3欢迎回来,亲爱的xilou用户5欢迎回来,亲爱的xilou用户7Process finished with exit code 0‘‘‘# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录import timeuserstaus={‘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 wrappersum =auth(sum)sum(1,2)sum(2,3)sum(2,5)sum(2,5)‘‘‘结果:请输入名字xilou请输入密码666登陆成功3欢迎回来,亲爱的xilou用户5请输入名字xilou请输入密码666登陆成功7欢迎回来,亲爱的xilou用户7Process 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_timedef sum(x, y):    sum = x + y    time.sleep(3)    print(sum)    return sumsum(1,2)sum(2,2)sum(2,3)