高阶函数
First Class Object
- 函数在python中是一等公民
- 函数也是对象,可调用的对象
- 函数可作为普通变量、参数、返回值等等
高阶函数
- 数学概念 y=g(f(x))
- 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
- 接受一个或多个函数作为参数
- 输出一个函数
自定义sort函数
- 排序问题
- 仿照内建函数sorted,请自行实现一个sort函数。能够为序列元素排序
- 思路
- 内建函数sorted函数返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。自定义函数也需要实现这些功能
- 新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中
sort函数实现。
基本思路的实现
#自定义排序函数: def sort(iterate): netlist = [] for x in iterate: for i,y in enumerate(netlist): if x > y: #找到大的就插入,如果换成x < y 是同样的 netlist.insert(i,x) #降序 break #这个braek 是必须加的,当if条件成立就变成死循环了 else: #不大于,说明就是最小的,尾部追加 netlist.append(x) return netlist print(sort([1,2,3,45,5,6,8,123]))
用参数控制升序还是降序
#自定义排序函数: def sort(iterate,reverse=False): netlist = [] for x in iterate: for i,y in enumerate(netlist): flag = x > y if reverse else x < y #默认是升序,如果reverse = True 为降序 if flag: netlist.insert(i,x) break else: netlist.append(x) return netlist print(sort([1,2,3,45,5,6,8,123]))
用lambda函数实现,反转功能
#自定义排序函数: def sort(iterate,reverse=False,key=lambda x,y : x<y): netlist = [] for x in iterate: for i,y in enumerate(netlist): #flag = x > y if reverse else x < y #默认是升序,如果reverse = True 为降序 flag = key(x,y) if not reverse else not key(x,y) if flag: netlist.insert(i,x) break else: netlist.append(x) return netlist print(sort([1,2,3,45,5,6,8,123],reverse=True))
内建高阶函数
sorted(iterable[,key][,reverse]) 排序
- 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否反转
- 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,9,4,55,150,-3,78,28,123]))
map(function,*iterables) --> map object
- 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
- list(map(lambda x: 2*x+1,range(5)))
- dict(map(lambda x: (x%5,x),range(500)))
函数柯里化
柯里化
- 指的是将原原来接受两个参数的函数变成接受一个参数的函数过程,新的函数参数返回一个以原有第二个参数为参数的函数
- z = f(x,y) 转化为 z = f(x)(y)的形式
将加法函数柯里化
#将加法函数柯里化 #原函数 #def add1(x,y): # return x+y #柯里化函数 def add(x): def _add(y): return x+y return _add print(add(4)(5))
通过嵌套函数将函数柯里化