1. 程式人生 > >python習題三道

python習題三道

過期 編碼 存滿 sig ems rgs 不包含 解構 pop

字典扁平化

目標  {‘a‘:{‘b‘;1,‘c‘:2},d:{‘e‘:3,f:{g:4}
期望  {‘a.b‘:1,‘a.c‘:2,‘d.e‘:4,‘d.f.g‘:4}
dic = {‘a‘:{‘b‘:1,‘c‘:2},‘d‘:{‘e‘:3,‘f‘:{‘g‘:4}}}
dic1 = {}
def fn(dic:dict,dic1key=‘‘):
        for k,v in dic.items():
                if isinstance(v,dict):
                        fn(v,dic1key=dic1key+ k +‘.‘)
                else:
                        dic1[dic1key + k] = v
fn(dic)
print(dic1)

base64編碼

alphabet = b‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/‘

def base64encode(src:str):
        target = bytearray()
        if isinstance(src,str):
                ret = src.encode()
        else:
                return
        length = len(ret)

        r = 0  # 余下幾個
        for offset in range(0,length,3):
                tripe = ret[offset:offset+3]
                if offset + 3 > length:
                        r = 3 - len(tripe)
                        tripe = tripe + b‘\x00‘*r

                val = int.from_bytes(tripe,‘big‘)

                for i in range(18,-1,-6):
                        if i == 18:
                                index = val >> i
                        else:
                                index = val >> i & 0x3F
                        target.append(alphabet[index])
        for i in range(1,r+1):
                target[-i] = 61
        return bytes(target)

base64encode(‘a‘)

求最大公共字串

     矩陣算法
    str1 = ‘abcdef‘
    str2 = ‘defabcd‘
    def fn(str1:str,str2:str):
            if len(str1) > len(str2):
                    str1,str2 = str2 ,str1
            length1 = len(str1)  # 最短
            length2 = len(str2)

            matrix = [[0]*length1 for i in range(length2)]
            # print(matrix)

        xmax = 0
        xindex = 0

        for i,x in enumerate(str2):
                for j,y in enumerate(str1):
                        if x != y:
                                pass
                        else:
                                if i==0 or j==0:
                                        matrix[i][j] = 1
                                else:
                                        pre = matrix[i-1][j-1]
                                        if pre > 0:
                                                matrix[i][j] = pre + 1
                                if matrix[i][j] > xmax :
                                        xmax = matrix[i][j]
                                        xindex = j
        # print(matrix)
        # print(xmax, xindex)

        start= xindex + 1 -xmax
        end = xindex +1
        return str1[start:end]

print(fn(str1,str2))

裝飾器的應用

實現一個cache裝飾器,實現可過期被清除的可能
簡化設計,函數的參數定義不包含可變位置參數,可變關鍵字參數和keyword-only參數
可以不考慮緩存滿了之後的換出問題

from functools import wraps
import inspect
import time
import datetime

def mag_cache(fn):
        local_cache = {} #對不同函數名是不同的cache
        @wraps(fn)
        def wrapper(*args,**kwargs): #接收各種參數
                expire_keys = []
                for k,(_,stamp) in local_cache.items():
                        if (datetime.datetime.now().timestamp() - stamp) > 5:
                                expire_keys.append(k)
                for k in expire_keys:
                        local_cache.pop(k)

                # 參數處理,構建key
                sig = inspect.signature(fn)
                params = sig.parameters  # 有序字典
                params_dict = {}

                values = list(params.values())  #  有序的
                keys = list(params.keys())

                #位置傳參
                # for i,x in enumerate(args):
                #     params_dict[keys[i]] = v
                params_dict.update(zip(params.keys(),args))
                #  關鍵字傳參
                params_dict.update(kwargs)
                #  缺省值
                for k,v in params.items():# 定義的所有參數
                        if k not in params_dict:
                                params_dict[k] = v.default

                key = tuple(sorted(params_dict.items())) # 判斷是否需要緩存
                print(key)

                if key not in local_cache.keys():
                        local_cache[key] = fn(*args,**kwargs),datetime.datetime.now().timestamp()
                return local_cache[key]
        return wrapper

@mag_cache
def add(x=4,y=5):
        time.sleep(3)
        return x+y

命令分發器

程序員可以方便的註冊函數到某一個命令,用戶輸入命令時,路由到註冊的函數
如果此命令沒有對應的註冊函數,執行默認函數
用戶輸入用input(">>")
def cmd_dispatcher(): #封裝
        cmd_dict = {}

        def reg(cmd):
                def _reg(fn):
                        cmd_dict[cmd] = fn
                        return fn
                return _reg

        @reg(‘default_func‘)
        def default_func():
                print(‘default‘)
                return

        def dispatcher():
                while True:
                        cmd = input(‘>>‘)
                        if cmd == ‘quit‘:
                                return
                        cmd_dict.get(cmd, default_func)()

        return reg, dispatcher #封裝

reg, dispatcher = cmd_dispatcher() #封裝&解構

@reg(‘add‘)
def add(): #add=reg(‘add‘)(add)
        print(1)
        return

dispatcher()

python習題三道