作业:
# 一:编写函数,(函数执行的时间用time.sleep(n)模拟)
ANSR:
def func(name):
    time.sleep(2)
    print("This is home of ",name)
    return "D.J.Trump"
# 二:编写装饰器,为函数加上统计时间的功能
ANSR:
import time
from functools import wraps
def timmer(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("run time is %s s" %(stop_time - start_time))
        return res
    return wrapper
@timmer
def func(name):
    time.sleep(2)
    print("This is home of ",name)
    return "D.J.Trump"
func("Trump")   # This is home of  Trump
                # run time is 2.0006821155548096 s
# 三:编写装饰器,为函数加上认证的功能
ANSR:
import time
from functools import wraps
def auth(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        name = input("用户名:").strip()
        pwd = input("密码: ").strip()
        if name == "egon" and pwd == "250":
            print("用户认证成功!")
            res = func(*args,**kwargs)
            return res
        else:
            print("用户名或密码错误,登录失败!")
    return wrapper
@auth
def func(name):
    time.sleep(2)
    print("This is home of ",name)
    return "D.J.Trump"
func("Trump")   # 用户名:egon
                # 密码: 250
                # 用户认证成功!
                # This is home of  Trump
# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
ANSR:
import time
from functools import wraps
login_user = None
def auth(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        name = input("用户名:").strip()
        pwd = input("密码: ").strip()
        with open(r"db.txt",mode="rt",encoding="utf-8") as f:
            for line in f:
                dic = eval(line)
                if name == dic["name"] and pwd == dic["password"]:
                    print("用户认证成功!")
                    login_user = name
                    res = func(*args,**kwargs)
                    return res
            else:
                print("用户名或密码错误,登录失败!")
    return wrapper
@auth
def func(name):
    time.sleep(2)
    print("This is home of ",name)
    return "D.J.Trump"
func("Trump")   # 用户名:egon
                # 密码: 123
                # 用户认证成功!
                # This is home of  Trump
# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
ANSR:
import time
from functools import wraps
login_user = None
def auth(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        name = input("用户名:").strip()
        pwd = input("密码: ").strip()
        with open(r"db.txt",mode="rt",encoding="utf-8") as f:
            for line in f:
                dic = eval(line)
                if name == dic["name"] and pwd == dic["password"]:
                    print("用户认证成功!")
                    login_user = name
                    start_time = time.time()  
                    res = func(*args,**kwargs)
                    while True:
                        stop_time = time.time()
                        time.sleep(2)
                        run_time = stop_time - start_time
                        if run_time >= (3600):  
                            print("您已登录{}小时,为保证您账户的安全,系统已为您下线,请重新登录".format((run_time / 60 / 60)))
                            login_user = None
                            break
                    return res
            else:
                print("用户名或密码错误,登录失败!")
    return wrapper
@auth
def func(name):
    time.sleep(2)
    print("This is home of ",name)
    return "D.J.Trump"
func("Trump")
# 六:编写装饰器,为多个函数加上记录日志的功能:函数一旦运行则按照下述格式记录日志
    函数开始执行的时间  函数名  返回值
    2020-06-18 12:13:38  index  456
    2020-06-18 12:13:39  home  123
    提示:
        统计时间time.strftime('%Y-%m-%d %H:%M:%S')
        函数名func.__name__
ANSR:
/