高阶函数:我的理解就是闭包、内嵌函数
举例:
计数器:
有问题么?
问题出在base+=step,对base赋值,局部变量,没有先定义
改进:声明为非局部变量nonlocal,但是不要是global变量
观察一下:
id(f1)
id(f2)
f1==f2
自定义sort函数:
改写为高阶函数,注意comp函数:
comp函数比较通用。可以抽象出来。如下:
再改写成高阶函数形式:
先简化一下comp函数,使其不带reverse参数:
替换成sort自己的调用:
再进一步改造comp函数为匿名函数lambda a,b:a<b
再改造一下,去掉reverse参数吗,由匿名函数比较关系决定升序还是降序
#%% #最原始的排序 lst=[1,2,5,4,2,3,5,6] def sort(iterable): ret=[] for x in iterable: for i,y in enumerate(ret): if x>y: ret.insert(i,x) break else: ret.append(x) return ret
sort(lst)
#%% #加入reverse参数,控制升序、降序,添加flag标志 lst=[1,2,5,4,2,3,5,6] def sort(iterable,reverse=False): ret=[] for x in iterable: for i,y in enumerate(ret): flag=x>y if reverse else x<y if flag: ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,True)
#%% #嵌套函数,实现判断 lst=[1,2,5,4,2,3,5,6] def sort(iterable,reverse=False): def cmp(a,b): flag=a>b if reverse else a<b return flag ret=[] for x in iterable: for i,y in enumerate(ret): if cmp(x,y): ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,False)
#%% #把嵌套函数提取出来,成为公共函数 lst=[1,2,5,4,2,3,5,6] def cmp(a,b,reverse=False): flag=a>b if reverse else a<b return flag def sort(iterable): ret=[] for x in iterable: for i,y in enumerate(ret): if cmp(x,y,True): ret.insert(i,x) break else: ret.append(x) return ret
sort(lst)
#%% #把函数作为参数,设计高阶函数 lst=[1,2,5,4,2,3,5,6] def cmp(a,b,reverse=False): return a>b if reverse else a<b def sort(iterable,key=cmp,reverse=False): ret=[] for x in iterable: for i,y in enumerate(ret): if key(x,y,reverse): ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,reverse=True)
#%% #去掉公共函数的reverse参数,由主函数reverse控制升降序 lst=[1,2,5,4,2,3,5,6] def cmp(a,b): return a>b def sort(iterable,key=cmp,reverse=False): ret=[] for x in iterable: for i,y in enumerate(ret): flag=key(x,y) if reverse else key(y,x) if flag: ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,reverse=True)
#%% #去掉公共函数。利用lambda匿名函数 lst=[1,2,5,4,2,3,5,6] def cmp(a,b): return a>b def sort(iterable,key=lambda a,b:a>b,reverse=False): ret=[] for x in iterable: for i,y in enumerate(ret): flag=key(x,y) if reverse else key(y,x) if flag: ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,reverse=False)
#%% #继续优化,利用匿名函数去电reverse参数 lst=[1,2,5,4,2,3,5,6]
def sort(iterable,key=lambda a,b:a>b): ret=[] for x in iterable: for i,y in enumerate(ret): if key(x,y): ret.insert(i,x) break else: ret.append(x) return ret
sort(lst,lambda a,b:a<b)
知识点补充:enumerate、集合set操作
>>> import random >>> l=[random.randint(1,100) for i in range(5)] >>> l [10, 14, 62, 30, 45]
>>> print(list(enumerate(l))) [(0, 10), (1, 14), (2, 62), (3, 30), (4, 45)] >>> for e in enumerate(l): print(e[0]) 0 1 2 3 4
>>> for i,x in enumerate(l): print(i,' ',x) 0 10 1 14 2 62 3 30 4 45
>>> k=set(l) >>> k {10, 45, 14, 30, 62}
| add(...) | Add an element to a set. | | This has no effect if the element is already present. | | clear(...) | Remove all elements from this set. | | copy(...) | Return a shallow copy of a set. | | difference(...) | Return the difference of two or more sets as a new set.