高阶函数
函数
- 函数也是对象,是可以调用的对象
- 函数可以作为普通变量,也可以做为函数的参数,返回值
高阶函数
- 高阶函数至少满足两个条件
- 接受一个或者多个函数作为参数
- 输出一个函数
自定义一个函数:
如下
def sort(iterable,* , key=None,reverse=False):
newlist = []
for x in iterable:
xx = key(x) if key else x
for i ,y in enumerate(newlist):
yy = key(y) if key else y
flag = xx > yy if reverse else xx < yy
if flag :
newlist.insert(i,x)
break
else:newlist.append(x)
return newlist
key 作为一个关键字传入,也可以作为函数传入, 比如 key = lambda x:10-x
i
内建高阶函数
排序 sorted
- 定义 sorted(iterable,* ,key = None,reverse = False ) =>list
sorted(list,key= lambda x:6-x) #返回新列表
list.sort(key= lambda x: 6-x) #就地修改
过滤 filter
- 定义,filter(function,iterable)
- 对可迭代对象进行遍历,返回一个迭代器
- function参数是一个参数的函数,而且返回值应当是bool类型,或其返回值等效为布尔类型
- function参数如果是None,可迭代对象的每一个元素自身等效布尔值
list(filter(lambda x: x%3==0, [1,9,55,150,-3,78,28,123]))
>>>[9, 150, -3, 78, 123]
list(filter(None, range(5)))
>>>[1, 2, 3, 4]
list(filter(None, range(-5, 5)))
>>>[-5, -4, -3, -2, -1, 1, 2, 3, 4]
映射 map
- 定义 map(function, ,iterables)* =>map object
- 对多个可迭代对象的元素,按照指定的函数进行映射
- 返回一个迭代器
list(map( lambda x: 2* x+1, range(10)))
>>>[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
dict(map( lambda x: (x %5, x), range(500)))
>>>{0: 495, 1: 496, 2: 497, 3: 498, 4: 499}
dict(map( lambda x,y: (x ,y), 'abcde', range(10)))
>>>{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}
柯里化
- 指的是将原来接受两个参数的函数变成新的接受一个函数的过程,新的函数返回一个以原有第二个参数为参数的函数
- z = f(x,y)转换成 z = f(x)(y)的形式
例如:
def add(x,y):
return x + y
转换成
def add(x):
def _add(y):
retrurn x + y
return _ add
通过函数嵌套的方式就可以把函数转换为柯里化