闭包函数、简单装饰器

一:编写函数(函数执行的时间是随机的)

import time
import random

def fun1():
    time.sleep(random.randrange(1,3))
    print(random.randrange(1,3))

fun1()

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

import time
import random

def timer(func):
    #func = fun1
    def wrapper():
        star_time = time.time()
        func()
        stop_time = time.time()
        print('执行时间:%s' %(stop_time - star_time))
    return wrapper

@timer
def fun1():
    time.sleep(random.randrange(1,3))
    print('你不是傻了吧!')

fun1()

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

import time
import random

def timer(func):
    #func = fun1
    def wrapper():
        star_time = time.time()
        func() # fun1
        stop_time = time.time()
        print('执行时间:%s' %(stop_time - star_time))
    return wrapper

def auth_deco(func):
    def deco():
        user = input('username:')
        pwd = input('password:')
        if user == '123' and pwd == '123':
            print('Login Successful')
            func() # wrapper 
        else:
            print('Login err')
    return deco

@auth_deco
@timer
def fun1():
    time.sleep(random.randrange(1,3))
    print('你不是傻了吧!')

fun1()

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

login_dic = {
    'user':None,
    'status':False,
}
def auth_deco(func):
    def wrapper(*args,**kwargs):
        if login_dic['user'] and login_dic['status']:
            res = func(*args,**kwargs)
            return res

        user = input('username:')
        pwd = input('password:')
        with open(db_path, 'r', encoding='utf-8') as read_f:
            user_dic = eval(read_f.read())

        if user in user_dic and pwd == user_dic[user]:
            print('Login Successful')
            login_dic['user'] = user
            login_dic['status'] = True
            res = func(*args, **kwargs)
            return res
        else:
            print('用户名或者密码错误,重新登录')
    return wrapper

@auth_deco
def index():
    print('welcome to index')

@auth_deco
def home(name):
    print('welcome %s to home page' %name)


 print(user_dic)
index()

home('egon')

五:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
from urllib.request import urlopen

def get(url):
    return urlopen(url).read()

print(get('https://www.python.org'))

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

cache_path = r'D:\Learn\PyCharm\b.txt'
def make_cache(func):
    def wrapper(*args, **kwargs):
        if os.path.getsize(cache_path):  
            with open(cache_path,'rb') as f:
                res = f.read()
        else:
            res = func(*args, **kwargs)
            with open(cache_path,'wb') as f: 
                f.write(res)
        return res
    return wrapper


@make_cache
def get(url):
    return urlopen(url).read()


print(get('https://www.python.org'))

七:在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

func_dic={}

def deco(key):
    def deco2(func):
        func_dic[key]=func
    return deco2

@deco('f1')
def f1():
    print('from f1')

@deco('f2')
def f2():
    print('from f2')

@deco('f3')
def f3():
    print('from f3')

print(func_dic)

while True:
    cmd = input('>>: ').strip() 
    if cmd in func_dic:
        func_dic[cmd]()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值