• 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)
  • 相关阅读:
    DP:Multiplication Puzzle(POJ 1651)
    Heap:Expedition(POJ 2431)
    velocity.js 动画插件
    ES6 新特性
    ps p图
    php 建站 多域名配置 自定义重定向
    移动端开发 资源分享
    拖拽 初体验
    颜色选择器 rgb 与16进制 颜色转换
    web 常用颜色
  • 原文地址:https://www.cnblogs.com/09120912zhang/p/7545876.html
Copyright © 2020-2023  润新知