文档章节

Python3函数之装饰器应用

夏洛特_
 夏洛特_
发布于 2016/10/28 06:57
字数 644
阅读 24
收藏 0

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

from functools import wraps

def 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 inspect

def 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

@typed
def 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 wrap
def 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 random
import time

def data_source():
    while True:
        yield random.randint(0, 100)
        time.sleep(0.1)
ds = data_source()
import datetime

def 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 ret
g = top_k1(10)
for _ in range(3):
    print(next(g))
import datetime

def 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, pop
add, pop = heap()
import datetime

def 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

 

© 著作权归作者所有

共有 人打赏支持
夏洛特_
粉丝 2
博文 80
码字总数 72279
作品 0
宁德
程序员
私信 提问
每周一个 Python 模块 | functools

functools 是 Python 中很简单但也很重要的模块,主要是一些 Python 高阶函数相关的函数。 该模块的内容并不多,看 官方文档 也就知道了。 说到高阶函数,这是函数式编程范式中很重要的一个概...

yongxinz
2018/11/12
0
0
python三大神器===》装饰器

1.认识装饰器   如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改...

许传坤
2018/08/23
0
0
Python函数基础教程-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83579571 Python函数基础教程—730人已学习 课程介绍 通过本次课程的讲解,可以...

安静的技术控
2017/12/15
0
0
转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客《python中decorator详解》 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器——decorator。 python中的函数即objects...

laugh2last
2015/08/17
0
0
Python - 装饰器使用过程中的误区

曾灵敏 — APRIL 27, 2015 装饰器基本概念 大家都知道装饰器是一个很著名的设计模式,经常被用于AOP(面向切面编程)的场景,较为经典的有插入日志,性能测试,事务处理,, 等。 Python语言本...

OneAPM1
2015/05/08
0
1

没有更多内容

加载失败,请刷新页面

加载更多

sql根据日期查询,本周,本月,本年,今日相关统计

sql根据日期查询,本周,本月,本年,今日相关统计 昨天 select * from tb where datediff(day, 时间字段 ,getdate()) = 1 今天 select * from tb where datediff(day, 时间字段 ,getdate()) = ...

BraveLN
12分钟前
1
0
Delphi 折叠代码编译变量$REGION

编译变量$REGION,用于在delphi2006以后版本的折叠代码显示,非常方便。 procedure TForm1.Button1Click(Sender: TObject); var uStr: UnicodeString; begin {$REGION '显示uStr变量内容'} ......

dillonxiao
13分钟前
0
0
【更新】SyntaxEditor发布v2018.1,可共享相同代码库

SyntaxEditor最新版本下载 SyntaxEditor是一款强大的代码语法检验控件,采用了当今最前沿的代码编辑的技术,可以为你代码编辑提供强大的管理功能。最新版支持Visual Studio 2013和Windows 8...

电池盒
13分钟前
0
0
如何在基于Bytom开发过程中集成IPFS

本文介绍了基于Bytom开发过程中集成IPFS。 step1: 搭建bytom节点 比原相关资料:https://github.com/Bytom-Community/Bytom_Docs 搭建bytom节点有很多方式,然后开启RPC调用模式。这里推荐用...

比原链Bytom
18分钟前
0
0
sqlyog注册码

sqlyog注册码 1.方式一 用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417 a56ea5da-f30b-4fb1-8a05-95f346a9b20b a0fe8645-3916-45d4-9976-cb6b88fecc6c b70d7f66-dac2-4462-......

dragon_tech
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部