作业14

作业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

原文地址:https://www.cnblogs.com/achai222/p/12553229.html