Python装饰器

关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。
def is_not_empty(s):
    return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
修改为:
print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])
 
装饰器:
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。
使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。
计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。
参考代码:
import time
def performance(f):
    def fn(*args, **kw):#使得调入的函数参数可以任意多个
        t1 = time.time()
        r = f(*args, **kw)
        t2 = time.time()
        print 'call %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn
 
@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

  

 
 
上一节的@performance只能打印秒,请给 @performace 增加一个参数,允许传入's'或'ms':
要实现带参数的@performance,就需要实现:
my_func = performance('ms')(my_func)
需要3层嵌套的decorator来实现。
import time
def performance(unit):
    def perf_decorator(f):
        def wrapper(*args, **kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
            print 'call %s() in %f %s' % (f.__name__, t, unit)
            return r
        return wrapper
    return perf_decorator
 
@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

  

 
好好学习,天天向上
原文地址:https://www.cnblogs.com/topass123/p/12923304.html