python第五天函数式编程

  高阶函数:把函数作为参数传入,这样的函数称为高阶函数。

     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案例 把字符串转换为浮点数

#把字符串转换为浮点型数据
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)  
View Code

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时,才真正计算求和

#返回函数 惰性求和

def lazy_sum(*args):
 def sum():
  ax=0;
  for n in args:
   ax=ax+n
  return ax
 return sum
View Code

 

     在上述例子中,在函数lazy_sum中有定义了函数sum,并且内部sum函数可以引用外部函数lazy_sum的参数和局部变量,

当外部函数返回sum函数时,相关的参数和变量都保存在返回的函数中,这种成为闭包。

记住返回函数时,该函数并未执行,返回函数不要引用任何可能会变化的变量。

 

匿名函数:lambda x:x*x表示求x^2的匿名函数,其中参数为x.

       

装饰器:在代码运行期间动态增加功能的方法

       两层结构的装饰器 

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')
View Code

 
三层结构的装饰器

#三层结构装饰器
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')
View Code

 案例把两层和三层合并

#合并两层和三层结构
#使的@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)
View Code

 调用如图:

偏函数:Python的functools模块中提供很多有用的功能,其中之一就是偏函数,

  functools.partial就是帮助我们创建一个偏函数,实际上   functools.partial(int,base=2)就帮我们固定了一个默认转换的进制参数为2的int函数

 

def int2(n,base=2):
 int(n,base)

 

posted @ 2017-09-18 23:13  张秀杰  阅读(132)  评论(0编辑  收藏  举报