学习是一个逐步发现自己无知的过程!

Python装饰器练习题

# 一:编写函数,(函数执行的时间是随机的)
import time
import random
def func():
    start_time = time.time()
    count = 1
    while count < 999:
        count += 1
    end_time = time.time()
    print(end_time - start_time)
func()
# ----------
# random()方法返回的是随机生成的一个实数
def func():
    time.sleep(random.randrange(1,3))  # 产生随机数当作休息时间
    print(random.randrange(1,3))
func()
# ----------
print('randrange(1,100,2):',random.randrange(1,100,2))
print('randrange(100)',random.randrange(100))

# 二:编写装饰器,为函数加上统计时间的功能
import time

def timess(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("运行时长%s:"%(stop_time - start_time))
        return res
    return wrapper

@timess
def ffo():
    time.sleep(1)
ffo()

# 三:编写装饰器,为函数加上认证的功能
import time

def timess(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("运行时长%s:"%(stop_time - start_time))
        return res
    return wrapper

def login(func):
    def wrapper(*args,**kwargs):
        user = input("username: ").strip()
        pwd = input("password: ").strip()
        if user == "rocco" and pwd == "999":
            print("login ok")
            res = func(*args,**kwargs)
            return res
        else:
            print("login no")
    return wrapper

@timess
@login
def ffo():
    time.sleep(1)
ffo()


# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
dab = "userfile.txt"
status = {"user":None,"status":False}
def func(type="file"):
    def func1(func):
        def wrapper(*args,**kwargs):
            if status["user"] and status["status"]:
                return func(*args,**kwargs)
            if type == "file":
                with open(dab, 'r', encoding='utf-8') as f:
                    dicts = eval(f.read())
                name = input("输入用户名: ").strip()
                passwd = input("输入密码: ").strip()
                if name in dicts["username"] and passwd == dicts["password"]:
                    status["user"] = name
                    status["status"] = True
                    res = func(*args,**kwargs)
                    return res
                else:
                    print("用户或密码错误")
            elif type == "sql":
                pass
            else:
                pass
        return wrapper
    return func1
@func()
def index():
    print("index")

@func(type='file')
def home(name):
    print(f"{name}")
index()
home("rocco")


# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录

import time
import random
tus = {"user":None,"login":None,"time_time":0.03}

def timerr(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        stop = time.time()
        print("Run time%s" %(stop-start))
        return res
    return wrapper

def aut(func):
    def wrapper(*args,**kwargs):
        if tus["user"]:
            time_time = time.time() - tus["login"]
            if time_time < tus["time_time"]:
                return func(*args,**kwargs)
        name = input("name>").strip()
        pwd = input("password").strip()
        if name == "rocco" and pwd == "r123":
            tus["user"] = name
            tus["login"] = time.time()
            res = func(*args,**kwargs)
            return res
    return wrapper
@timerr
@aut
def inde():
    time.sleep(random.randrange(3))
    print("aut to inde")
@timerr
@aut
def home(name):
    time.sleep(random.randrange(3))
    print("%s to home " %name)

inde()
home("rocco")

# 六:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果

from urllib.request import urlopen
def index(url):
    def get():
        return urlopen(url).read()
    return get

b = index("http://www.cn.bing.com")
print(b().decode('utf-8'))



# 七:为题目五编写装饰器,实现缓存网页内容的功能:
# 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中




# 扩展功能:用户可以选择缓存介质/缓存引擎,针对不同的url,缓存到不同的文件中



# 八:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

dictes = {}
def make_name(name):
    def name_dic(func):
        dictes[name] = func
    return name_dic

@make_name("Rocco")
def name1():
    print("Rocco")

@make_name("Sirliu")
def name2():
    print("Sirliu")

@make_name("chendan")
def name3():
    print("Chendan")
print(dictes)

# 九 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
# 注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')

import time
import os

def logg(logfile):
    def doc(func):
        if not os.path.exists(logfile):  # exists稍后将更多文件添加到这里
            with open(logfile,'w'):pass

        def wrapper(*args,**kwargs):
            res = func(*args,**kwargs)
            with open(logfile,'a',encoding='utf-8') as f:
                f.write(f"{time.strftime('%Y-%m-%d %X'),func.__name__}\n")
            return res
        return wrapper
    return doc

@logg(logfile="filelog.log")
def ind():
    print("index>>>")
ind()


 

赞(0)
未经允许不得转载:劉大帥 » Python装饰器练习题

你的评论可能会一针见血! 抢沙发

登录

找回密码

注册