高阶函数:把函数作为参数传入,这样的函数称为高阶函数。
python中允许变量指向函数,其实函数名就是一个指向函数的变量。
map/reduce
python内置了map()和reduce()函数,map函数的用法????
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用于序列的每一个元素,并把结果作为新的Iterator返回。
看看reduce的用法。reduce把一个函数作用在一个序列[x1,x2,x3,......]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果 reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
map/reduce案例 把字符串转换为浮点数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#把字符串转换为浮点型数据 def str2float(SNumber): def dits(name): return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'.':'.'}[name] def findPointPosition(L): if '.' in L: for i in range(len(L)): if L[i]=='.': return i else: return len(L) def firstmethod(x,y): return x*10+y def secondmethod(x,y): return x*0.1+y def getData(L,i,firstmethod,secondmethod): L1=L[:i] L2=L[-1:i:-1] print('L1=',L1,'L2=',L2) return reduce(firstmethod,L1)+reduce(secondmethod,L2)*0.1 Target=list(map(dits,SNumber)) value=getData(Target,findPointPosition(Target),firstmethod,secondmethod) print(value)
filter过滤器
Python内建的函数filter用于过滤序列,有两个参数类似于map,但和map不同的是,filter()把传入的函数作用于序列中的每一个数据,然后根据返回值决定是否保留该元素。
案例用过滤器选出100内的奇数
排序算法
Python内置的sorted()函数可以对list进行排序,其实sorted()是一个高阶函数,允许接受一个key来实现自定义排序。
理解其中的key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序k,对比上述操作
list=[36,5,-12,9,-21] keys=[36,5,12,9,21] 然后在排序 [5,9,12,21,36],最终结果为[5,9,-12,-21,36]
sorted函数中还有一个参数reverse=True表示按逆序排序,reverse=False表示按顺序 默认为顺序
案例 求出一组tuple表示学生名字和成绩的排序
返回函数 :高阶函数中除了可以接受函数作为参数外,还可以把函数作为结果返回。如下代码:调用函数f时,才真正计算求和
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#返回函数 惰性求和 def lazy_sum(*args): def sum(): ax=0; for n in args: ax=ax+n return ax return sum
在上述例子中,在函数lazy_sum中有定义了函数sum,并且内部sum函数可以引用外部函数lazy_sum的参数和局部变量,
当外部函数返回sum函数时,相关的参数和变量都保存在返回的函数中,这种成为闭包。
记住返回函数时,该函数并未执行,返回函数不要引用任何可能会变化的变量。
匿名函数:lambda x:x*x表示求x^2的匿名函数,其中参数为x.
装饰器:在代码运行期间动态增加功能的方法
两层结构的装饰器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def log(func): def wrapper(*arges,**kw): print('call %s():'%func.__name__) return func(*arges,**kw) return wrapper #其中@log相当于执行now=log(now) @log def now(): print('2017-09-20')
三层结构的装饰器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#三层结构装饰器 def logM(text): def decorator(func): def wrapper(*args,**kw): print('%s %s():' %(text,func.__name__)) return func(*args,**kw) return wrapper return decorator #@logM('extends')相当于执行now=logM('extends')(now) @logM('extends') def nowM(): print('2017-09-21')
案例把两层和三层合并
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#合并两层和三层结构 #使的@logU('extends')和@logU能同时使用 import functools def logU(un): if isinstance(un,(str,int,float)): def decorator(func): @functools.wraps(func) def wrapper(*arges,**kw): print('%s %s():'%(un,func.__name__)) return func(*arges,**kw) return wrapper return decorator else: @functools.wraps(un) def wrapper(*arges,**kw): print('call %s():'%un.__name__) return un(*arges,**kw) return wrapper #相当于执行now=log(now) @logU def now(): print('2017-09-20') #相当于执行now=logM('extends')(now) @logU('extends') def nowM(): print('2017-09-21') # now()相当log(now)
调用如图:
偏函数:Python的functools模块中提供很多有用的功能,其中之一就是偏函数,
functools.partial就是帮助我们创建一个偏函数,实际上 functools.partial(int,base=2)就帮我们固定了一个默认转换的进制参数为2的int函数
def int2(n,base=2): int(n,base)