17---我是作业

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


def interesting(x, y):
    time.sleep(3)
    print(f'fascinating {x} and sexy {y}')


interesting('python', y='who')
二:编写装饰器,为函数加上统计时间的功能
import time


# 装饰器
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        stop = time.time()
        print(stop - start)
        return res

    return wrapper


# 被装饰对象
@timer
def interesting(x, y):
    time.sleep(3)
    print(f'fascinating {x} and sexy {y}')
    return 'who are you ?'


res = interesting('python', y='who')
print(res)
三:编写装饰器,为函数加上认证的功能
def auth(func):
    def wrapper():
        with open('info','r',encoding='utf-8') as f:
            username = input('小可爱,请输入您的用户名❤:')
            password = input('小可爱,请输入您的密码❤:')
            for line in f:
                name,pwd = line.strip().split(':')

                if username == name and password == pwd:
                    func()
                    break
            else:
                print('小可爱,您的账号或者密码可能有问题哦❤!')

    return wrapper

# 定义被装饰对象
@auth
def log():
    print ('小主人,欢迎光临!'.center(50,'❄'))


log()
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式

# 定义全局变量,判断用户是否登录
log_name = None
# 如果用户登录就执行洗碗功能
def auth(func):
    def wrapper(*args,**kwargs):
        if log_name is None:
            login()
        else:
            func()
    return wrapper

# 登录功能
def login():
    with open('db.txt','r',encoding='utf-8') as f:
        user = input('请输入用户名:')
        pwd = input('请输入密码:')
        for line in f:
            info = eval(line)
            name = info['name']
            password = info['password']
            if user == name and pwd == password:
                global log_name
                log_name = user
                print('登陆成功')
                break
        else:
            print('登陆失败')

# 洗碗功能
@auth
def wash():
    print('模范劳动人民,发小红花❀')

# 敷面膜
@auth
def facial():
    print('精致的猪猪女孩😊😊')

dic_func = {
    '0':('退出',exit),
    '1':('登录',login),
    '2':('洗碗',wash),
    '3':('贴面膜',facial),
}
for choice in dic_func:
    print(choice,dic_func[choice][0])

while True:
    cmd = input('请选择功能:')
    if not cmd.isdigit():
        print('别闹,认真点')
    if cmd in dic_func:
        if cmd == '1':
            if  log_name  is not None:
                print('您已登录,不需要重复登录')
                continue
            else:dic_func[cmd][1]()

        dic_func[cmd][1]()
    else:
        print('命令不存在')
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
import time
# 定义全局变量,判断用户是否登录
log_name = None
log_time = 0
end_time = 0
# 如果登陆时间超过10s需要用户重新登录
def timer(func):
    def wrapper(*args,**kwargs):
        if end_time-log_time <20:
            func()
        else:
            print('重新登陆')
            login()

    return wrapper
# 如果用户登录就执行功能
def auth(func):
    def wrapper(*args,**kwargs):
        if log_name is None:
            login()
        else:
            global end_time
            end_time = time.time()
            print(f'此时时间是{end_time}')
            func()
    return wrapper

# 登录功能

def login():
    with open('db.txt','r',encoding='utf-8') as f:
        user = input('请输入用户名:')
        pwd = input('请输入密码:')
        for line in f:
            info = eval(line)
            name = info['name']
            password = info['password']
            if user == name and pwd == password:
                global log_name,log_time
                log_name = user
                log_time = time.time()

                print(f'登陆成功,登陆成功的时间为{log_time}')
                break
        else:
            print('登陆失败')

# 洗碗功能
@timer
@auth
def wash():
    print('模范劳动人民,发小红花❀')

# 敷面膜
@timer
@auth
def facial():
    print('精致的猪猪女孩😊😊')

dic_func = {
    '0':('退出',exit),
    '1':('登录',login),
    '2':('洗碗',wash),
    '3':('贴面膜',facial),
}
for choice in dic_func:
    print(choice,dic_func[choice][0])

while True:
    cmd = input('请选择功能:')
    if not cmd.isdigit():
        print('别闹,认真点')
    if cmd in dic_func:
        if cmd == '1':
            if  log_name  is not None:
                print('您已登录,不需要重复登录')
                continue
            else:dic_func[cmd][1]()

        dic_func[cmd][1]()
    else:
        print('命令不存在')


六:选做题
# 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
# @deco1 # index=deco1(deco2.wrapper的内存地址)
# @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
# @deco3 # deco3.wrapper的内存地址=deco3(index)
# def index():
#     pass
def outter1(func):
    def wrapper(*args, **kwargs):
        func()
        print('outter1')
    return wrapper

def outter2(func):
    def wrapper(*args, **kwargs):
        func()
        print('outter2')
    return wrapper

def outter3(func):
    def wrapper(*args, **kwargs):
        func()
        print('outter3')
    return wrapper

@outter3
@outter2
@outter1
def index():
    print('index本体')
index()


posted @ 2020-03-23 22:33  微信搜索-程序媛小庄  阅读(180)  评论(0)    收藏  举报