文档章节

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中decorator详解》【转注:深入浅出清晰明了】

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

laugh2last
2015/08/17
0
0
python三大神器===》装饰器

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

许传坤
08/23
0
0
设计模式之:理解 Python 中的装饰器

1、问题 文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出......

大数据之路
2013/07/22
0
0
深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好像,他们要干的事都很相似——都是想...

大数据之路
2015/07/12
0
2
Python基础——装饰器、模块(0417)

一、Python基础——复习 1、字符串的常用操作 2、列表的常用操作 3、字典的常用操作 二、Python——装饰器:函数可以是变量 1、Python是一种面向对象的编程语言,在Python中所有的都可以是Pyt...

python初雪之路
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VS code编辑器安装 php7.2 NTS 版本 Xdebug

本文使用的是 phpstudy 一键安装包(windows32位) php 版本是 php7.2 NTS 1、在 phpstudy 面板中开启 phpdebug 扩展 // 其他选项菜单-> php 扩展与设置-> php 扩展 2、官方下载 Xdebug // ...

削个椰子皮_给个梨
21分钟前
1
0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果您也碰到了同样的问题,希望本文对您有用。 问题...

程序猿DD
52分钟前
2
0
sql 命令

show variables like '%general%'; show variables like '%log_output%'; show variables like '%quer%'; show global status like '%slow%';...

JavaSon712
59分钟前
2
0
Django修改默认数据库引擎

Django默认数据库引擎为sqlite3,除了sqlite3,还支持postgresql、mysql、oracle 配置如下:其中postgresql_psycopg2为postgresql的适配器。 'django.db.backends.postgresql' 'django.db.bac......

MichaelShu
今天
0
0
动画源码解析

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍 2.2 如何计算动画数据 2.3 什么是动画更新函数 2.4 动画数据如何存储 2.5 Animation的调用 3.Animator...

潇湘剑雨
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部