高阶函数
高阶函数满足上面至少一个特点。
- 能接收若干个函数作为参数
- 能返回一个函数
import math
def add(x, y, f):
return f(x) + f(y)
# 平方和
print add(25, 9, math.sqrt)
map()函数
它接收一个函数 f 和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
def format_name(s):
a=s.lower()
return a[0].upper()+a[1:]
# 得到['Adam', 'Lisa', 'Bart']
print map(format_name, ['adam', 'LISA', 'barT'])
reduce()函数
它接收一个函数 f、一个list及一个可选的默认初始结果值,传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
def prod(x, y):
return x*y
#结果为2*4*5*7*12=3360
print reduce(prod, [2, 4, 5, 7, 12])
filter()函数
filter()函数接收一个函数 f 和一个list,这个函数f的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件(函数返回true)元素组成的新list。
def is_not_empty(s):
return s and len(s.strip()) > 0
# 输出['test', 'str', 'END']
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
返回函数
函数可以返回一个函数,被返回的函数要在里面定义,当作一个对象返回。
def calc_prod(lst):
def fun():
def prod(x,y):
return x*y
return reduce(prod,lst,1)
return fun
#输出24 (4!=24)
f = calc_prod([1, 2, 3, 4])
print f()
闭包
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
函数定义和函数表达式位于另一个函数的函数体内。
函数A返回内部定义的函数B,则B为闭包,调用A时传递的参数为自由变量。
闭包特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。
def count():
fs = []
for i in range(1, 4):
def product(a=i):
return a*a
fs.append(product)
return fs
f1, f2, f3 = count()
#返回 1 4 9
print f1(), f2(), f3()
decorator
装饰器可简化代码,常用于:
- 打印日志,@log
- 检测性能,@performance
- 数据库事务,@transaction
- URL路由,@post('/login')
Python的decorator本质上是一个高阶函数,接收一个函数作为参数,并返回一个新函数。
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))
#结果:
#call factorial() in 0.009082s
#3628800
print factorial(10)
functools.partial
functools.partial用于创建偏函数,即可把一个参数多的函数变为一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。
int2 = functools.partial(int, base=2)
# int(value,base=2),按照二进制将value转为十进制数值
#结果:64
int2('1000000')