高阶函数
lamada表达式构建匿名函数/ 声明普通函数的函数名都可以当做一个变量, 那么这个变量当然可以被传入函数中。
把函数作为参数使用的函数, 叫高阶函数
python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率
-
map() python内置的一个高阶函数,它接收一个函数f和一个list,并且把list的元素以此传递给函数f,然后返回一个函数f处理完所有list元素的列表
-
filter() 函数接收一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回true或false,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件的元素组成的list;
-
sorted接受三个参数,返回一个排序之后的list。
--第一个接受一个可迭代的对象(因为sorted实现了迭代协议,所以接受的参数不一定需要list,可以迭代的对象就可以,也是duck typing),返回一个排序之后的列表。
--第二个接受一个布尔值,选择是否反转排序结果。
--第三个接受一个回调函数,这个回调函数只能有一个参数(如果有多个参数,请用偏函数),根据这个函数的返回值进行排序。
返回函数
需要注意的是, 在返回闭包中, 不能引用任何循环变量
def f():
print 'call f()...'
# 定义函数g:
def g():
print 'call g()...'
# 返回函数g:
return g
装饰器
装饰器(Decrator)
- 在不改动函数代码的基础上无限制扩展函数功能的一种机制,
- 本质上讲,装饰器是一个
返回函数
的高阶函数
- 装饰器的好处是,一点定义,则可以装饰任意函数
- 一旦被其装饰,则则把装饰器的功能直接添加到定义函数的功能上
装饰器的使用:
使用@语法,即在每次要扩展到函数定义前使用@+函数名
#既不需要侵入,也不需要函数重复执行
import time
def deco(func):
def wrapper(): //如果被引用方法带参数, 加入参数*args, **kwargs 即带不定参数
startTime = time.time()
func()//如果被引用方法带参数, 加入参数*args, **kwargs 即带不定参数
#从这里也可以发现, 装饰器仍然必须保留了原函数的调用, 这说明了
#(1) 装饰器不能修改被装饰的函数的源代码,只是对其 预处理/输入/结果进一步控制而已
# (2) 装饰器不能修改被装饰的函数的调用方式
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func():
print("hello")
time.sleep(1)
print("world")
if __name__ == '__main__':
f = func #这里f被赋值为func,执行f()就是执行func()
f()
如上例的deco就是一个基本的装饰器,注意--多个装饰器装饰一个函数,其执行顺序是从下往上。
偏函数
使用偏函数需要导入functools 模块
import functools import partial as pto
使用偏函数可以通过有效地“冻结”那些预先确定的参数,来缓存函数参数,然后在运行时,当获得需要的剩余参数后,可以将他们解冻,传递到最终的参数中,从而使用最终确定的所有参数去调用函数。
import functools import partial as pto
def add(a,b):
return a+b;
puls = pto(add,100)
result = puls(9)
在这里偏函数表达的意思就是,在函数add的调用时,我们已经知道了其中的一个参数,我们可以通过这个参数,重新绑定一个函数,就是pto(add,100),然后去调用即可。
对于有很多可调用对象,并且许多调用都反复使用相同参数的情况,使用偏函数比较合适。
网友评论