高阶函数
高阶函数概念
- 高阶函数作为函数的一种,也是可调用的对象
- 可以作为普通变量、参数、返回值等
- 至少满足下列一个条件 :
接受一个或多个函数作为参数
输出一个函数
自定义sort函数
内建函数 - 高阶函数
-
sorted(iterable[,key][,reverse]) 排序
-
返回一个新列表,对一个可迭代对象的所有元素排序,规则为key定义的函数,revers表示反转排序
-
sorted(lst,key=lambda x:6-x)
# 返回新列表 -
list.sort(key=lambda x:6-x)
# 就地修改 -
filter(function,iterable)
-
过滤可迭代对象的元素,返回一个迭代器
-
function一个具有一个参数的函数,返回bool
-
例:过滤数列中能被3整除的数字
list(filter(lambda x:x%3==0,[1,532,-22,27]))
-
map(function,*iterables) → map object
-
对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
list(map(lambda x:2*x+1,range(5)))
dict(map(lambda x:(x%5,x),range(500)))
柯里化
- 将原来接收两个参数的函数变成一个新的接收一个参数的函数。新函数返回一个以原有第二个参数为参数的函数
- 加法函数柯里化过程(嵌套):
- 原函数:
def add(x,y):
return x + y
- 柯里化之后:
def add(x):
def _add(y):
return x + y
return _add
装饰器
- 装饰器是高阶函数,是对传入函数的功能的装饰(功能增强)
- 调用方式:
@functionname
- 语法糖:
@logger # <=> fn = logger(fn)
- 例:
def logger(fn):
def wrapper(*args,**kwargs):
print('begin')
x = fn(*args,**kwargs)
print('end')
return x
return wrapper
@logger # <=> add = logger(add)
def add(x,y):
return x + y
print(add(1,6))
带参装饰器
- 在装饰器外层增加一层函数
- 返回一个无参装饰器
- 调用方式:
@functionname(参数列表)
文档字符串
- Python文档字符串Documentation Srtings
- 使用三引号标注,
位于函数语句块的第一行
- 使用
__doc__
访问文档
装饰器模版
reduce
- “减少”方法
- 可迭代对象不能为空,无初始值即在可迭代对象中取一个元素
from function import reduce
num=[1,5,6,8,2]
print(num)
print(sum(num))
print(reduce(lambda v,x: v+x,num))
partial偏函数
- 固定函数的部分参数,相当于为部分的参数添加了一个缺省值,返回一个新的函数
- 生成的新函数,是对原函数的封装
lru_cache
- lru:最近最少使用。cache:缓存
使用前提:
同样的函数参数得到的结果相同
函数执行的时间长,且需要多次执行
- 本质是函数调用的参数→返回值
- 缺点:
- 不支持缓存过期,key无法失效
- 不支持清除
- 不支持分布式,是一个单机的缓存
@functools.lru_cache(maxsize=128,typed=False)
- maxsize=None,则禁用LRU,缓存可以无限制增长;当maxsize是二的幂时,LRU功能执行得最好
- typed=True,分别缓存不同类型的函数参数;如f(3)和f(3.0)视为不同类型