无需手动缓存长度

今天在阅读《机器学习实战》的时候,看到了这样一句描述

IMG_0629

其中数据集是一个List。看到这里说到为了提高代码效率,特地开了一个变量来保存其长度。

Read more   2016/7/27 17:13 下午 posted in  Python

使用 Python 装饰器来将普通函数加入任务队列

对于操作『函数对象』来说,使用 Python 装饰器是一种非常优雅,非常 Pythonic 的一个方式。而在这篇文章中,对于任何一个普通的函数,只需要在函数定义前加一个装饰器调用,即可使得这一函数被调用时自动加入特定的任务队列,成为异步调用,而不会阻塞主线程。

Read more   2016/7/14 23:41 下午 posted in  Python

关于Python的logging模块初始化无效的一个小坑

众所周知,logging模块是一个非常方便好用的日志输出模块。但是最近的使用发现了一个小坑,记录一下,避免再次踩坑。

一般使用logging模块都会对其进行初始化,使用以下代码:

    log_format = '[%(levelname)s] %(asctime)s  %(filename)s line %(lineno)d: %(message)s'
    date_fmt = '%a, %d %b %Y %H:%M:%S'
    logging.basicConfig(
        format=log_format,
        datefmt=date_fmt,
        level=log_level,
    )
Read more   2016/4/19 23:45 下午 posted in  Python

Python Decorator的一些细节

装饰器函数并不是在被修饰函数调用的时候才执行,而是修饰语句所在的代码块被执行的时候执行。

而且当一个文件(模块)被import的时候,文件内的所有装饰器就会被激活执行。因为装饰器语句相当于文件中的普通语句,而非函数声明或者类声明的一部分。

用以下代码方便理解:

# sample.py

def decorator_function(func):
    print "executing the decorator."

    def wrapper(*args, **kwargs):
        print "decorated function is executing."
        return func(*args, **kwargs)

    return wrapper


print "this python file is executing."


@decorator_function
def test_function(sth):
    print "blablabla"+sth

test_function("yeah")

而当我们对一个类里面的普通函数使用修饰符进行修饰的时候,然后我们正常调用这一函数(通过实例化的对象调用),会报错提示这一函数变成了unbound method,缺少了类中函数默认的首参数self。这一问题是由于经过装饰器修饰的函数,实际上是被传递到了装饰器函数中,在这个装饰器函数中被独立调用的,而非被其原先所在的类对象调用。因此在这个装饰器函数中,没有其原来所在的类来对它进行调用,导致提示unbound method.

2016/3/31 19:14 下午 posted in  Python