侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Python3函数之装饰器应用

2023-12-15 星期五 / 0 评论 / 0 点赞 / 131 阅读 / 5939 字

1.写一个装饰器,对函数的部分或者全部参数做类型检查 from functools import wrapsdef type_check(*type_args, **type_kwargs):

1.写一个装饰器,对函数的部分或者全部参数做类型检查

from functools import wrapsdef type_check(*type_args, **type_kwargs):    def dec(fn):        @wraps(fn)        def wrap(*args, **kwargs):            for i, t in enumerate(type_args):                if not isinstance(args[i], t):                    print('pos {} argument {} type error'.format(i, args[i]))                    return None            for k, t in type_kwargs.items():                if not isinstance(kwargs[k], t):                    print('keyword argument {} => {} type error'.format(k, kwargs))                    return None            return fn(*args, **kwargs)        return wrap    return dec@type_check(x=int, y=int)def add(x, y):    return x + y

import inspectdef typed(fn):    @wraps(fn)    def wrap(*args, **kwargs):        for i, param in enumerate(inspect.signature(fn).parameters.values()):            if param.annotation:                if param.name in kwargs.keys():                    if not isinstance(kwargs[param.name], param.annotation):                        raise TypeError(param.name)                    else:                        if not isinstance(args[i].param.annotation):                            raise TypeError(param.name)        return fn(*args, **kwargs)    return wrap@typeddef add(x: int, y: int):    return x + y

2.自己实现partial函数

def partial(fn, **p_kwargs):    @wraps(fn)    def wrap(*args, **kwargs):        return fn( *args, **p_kwargs, **kwargs)    return wrapdef add(x, y):    return x + y

3.写一个函数,判断两个字典是否相等,字典的value可能为数字、字符串、元组、列表、集合和字典。如果value为列表或字典,需要判断其中两个元素是否相等

def dict_eq(a, b):    for k, v in a.items():        if k not in b.keys():            return False        else:            if not isinstance(v, (dict, list)):                if v != b[k]:                    return False                if isinstance(v, list):                    for i, item in enumerate(v):                        if len(b[k]) <= i:                            return False                        if b[k][i] != item:                            return False                if isinstance(v, dict):                    ret = dict_eq(v, b[k])                    if ret is False:                        return ret

4.模拟一个数据源不断的产生数值,求一段时间内,最大的K个元素

import randomimport timedef data_source():    while True:        yield random.randint(0, 100)        time.sleep(0.1)ds = data_source()
import datetimedef top_k1(k, time=3):    start = datetime.datetime.now()    lst = []    while True:        lst.append(next(ds))        current = datetime.datetime.now()        if (current - start).total_seconds() >= time:            start = current            lst.sort()            ret = []            for _ in range(k):                ret.append(lst.pop())            yield retg = top_k1(10)for _ in range(3):    print(next(g))
import datetimedef top_k2(k, time=3):    start = datetime.datetime.now()    lst = []    while True:        #lst.append(next(ds))        e = next(ds)        for i, v in enumerate(lst):            if e < v:                lst.insert(i, e)                break        else:            lst.append(e)        current = datetime.datetime.now()        if (current - start).total_seconds() >= time:            start = current            #lst.sort()            ret = []            for _ in range(k):                ret.append(lst.pop())            yield ret
def heap():    data = []    def add(e):        idx = len(data)        data.append(e)        parent_idx = (idx - 1) // 2        while parent_idx >= 0:            if data[idx] > data[parent_idx]:                data[parent_idx], data[idx] = data[idx], data[parent_idx]                idx = parent_idx                parent_idx = (idx - 1) // 2            else:                break        def pop():        if not data:            return None        if len(data) == 1:            return data.pop()        idx = 0        ret = data[idx]        data[idx] = data.pop()        left_idx = 2 * idx + 1        rigth_idx = left_idx + 1        while left_idx < len(data):            child_idx = left_idx            if rigth_idx < len(data) and data[rigth_idx] > data[left_idx]: # 存在右子节点 并且 右子节点大于左子节点                child_idx = rigth_idx            if data[idx] < data[child_idx]:                data[idx], data[child_idx] = data[child_idx], data[idx]                idx = child_idx                left_idx = 2 * idx + 1                rigth_idx = left_idx + 1            else:                break        return ret        return add, popadd, pop = heap()import datetimedef top_k3(k, time=3):    start = datetime.datetime.now()    add, pop = heap()    while True:        add(next(ds))        current = datetime.datetime.now()        if (current - start).total_seconds() >= time:            start = current            ret = []            for _ in range(k):                ret.append(pop())            yield ret

 

广告 广告

评论区