关键字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)