python习题五

本文介绍了一种使用Python实现的缓存装饰器,该装饰器能够根据设定的时间自动清除过期的缓存,同时展示了如何通过自定义参数识别函数调用并进行缓存管理。此外,还提供了Base64编码的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#编程实现cache装饰器,
import time
import datetime
from functools import wraps
import inspect

def cache(time=5):
    """设置最大缓存时间"""
    cache_dict = {}
    befor = None
    
    def logger(fn):
        
        def time_fn():
            """如果fn调用间隔时间>cache设置时间time,则清空cache"""
            nonlocal befor,cache_dict
            nowtime = datetime.datetime.now()
            if not befor:
                pass
            elif (nowtime-befor).total_seconds() > time:#时间差值超过time值
                cache_dict = {}
            befor = nowtime
            return None
        
        def check_params(*args,**kwargs):
            """"识别当前函数调用后,其形参对应值,返回一个元组key"""
            kk = {}
            
            values = inspect.signature(fn)
            a = values.parameters
            lis = list(a.values())
            for k,v in a.items():
                kk[k]=v.default
            if len(args)+len(kwargs) <= len(kk):#位置传参和关键字传参的数量不能超过函数定义数量
                s1 = set()
                if args:#如果收集到位置传参,则更改对应位置的值
                    for i,x in enumerate(args):
                        kk[lis[i].name] = x
                        s1.add(lis[i].name)
                    print('位置传参:',s1)
                if kwargs:#如果收集到关键字传参,并且之前的位置传参与关键字传参不冲突
                    for k1,v1 in kwargs.items():
                        if k1 in s1:
                            raise TypeError('{}() got multiple values for argument {}'.format(fn.__name__,k1))
                        else:
                            kk[k1] = v1
            else:
                raise TypeError('{}() takes {} positional arguments but {} were given'.format(fn.__name__,len(kk),len(args)+len(kwargs)))
            key_ = tuple(kk.items())
            print('当前key:',key_)
            return key_
            
        @wraps(fn)
        def cache_wrapper(*args,**kwargs):
            """cache装饰器,将函数调用实参及对应返回值记录于字典"""
            time_fn()
            key = check_params(*args,**kwargs)
            value = cache_dict.get(key)#查找Key是否在cache中
            if value is None:
                ret = fn(*args,**kwargs)
                cache_dict[key] = ret
                return ret
            else:
                return value
        return cache_wrapper
    return logger

@cache(10)  # add = cache()(add) -> add = logger(add) -> add(x,y) = cache_wrapper(x,y)
def add(x:int=2,y:int=4,z:int=6)->int:
    time.sleep(2)
    return x + y + z
    
#base64编码
def base64(string):
    #生成base64字典#
    l1 = ['+','/']
    base64 = { k:v for k,v in zip((i for i in range(64)),(chr(j) for j in range(65,123) if  not 90 < j <= 96))}
    for i in range(12):
        base64[i+52] = str(i) if i < 10 else l1[i-10]
    
    def encode_():#编码
        arc = ''
        b = '00'
        l2 = []
        for i,v in enumerate(string.encode(),1):
            v = bin(v)
            arc += v.replace('0b','0'*(8-(len(v)-2)))
        div,mod = divmod(i,3)
        few = 3-mod if mod else 0
        arc += '00000000'*few
        div = (i+few)//3
        for j in range(div*4-few):
            l2.append(base64[int('00'+arc[6*j:6*(j+1)],base=2)])
        l2.extend('='*few)
        return ''.join(l2)
    return encode_()

ccc = '严'
bbb = 'Man is distinguished, not only by his reason, but by this singular\
passion from other animals, which is a lust of the mind, that by a perseverance\
of delight in the continued and indefatigable generation of knowledge, exceeds the\
short vehemence of any carnal pleasure.'
aaa= '($ _ $)'
ddd = 'NUxpbDZKQ29JTys4ak9pK3Z1YVNraURsbkxEbWxybGxMZz09'

base64(aaa)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值