• Python入门篇-高阶函数


                  Python入门篇-高阶函数

                                          作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.高级函数 

    1>.First Class Object

        函数在Python中是一等公民
        函数也是对象,可调用的对象
        函数可以作为普通变量,参数,返回值等等

    2>.高阶函数

        数学概念:y=g(f(x))
        在数学和计算机科学中,高阶函数应当是至少满足下面一条条件的函数
            接收一个或多个函数作为参数
            输出一个函数对象

    3>.计数器

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 def counter(base):
     8     def inc(step=1):
     9         nonlocal base       #这里声明base不在inc作用域内(是counter内部作用域中的一个变量),当腰使用base可以去它上级作用域查找,但是不能去全局作用域查找哟~
    10         base += step
    11         return base
    12     return inc
    13 
    14 f1 = counter(5)
    15 
    16 f2 = counter(5)
    17 
    18 print("id(f1) = {} ,id(f2) = {} ,{}".format(id(f1),id(f2),f1 == f2))
    19 
    20 print("f1() = {}".format(f1()))
    21 print("f2() = {}".format(f2()))
    22 
    23 
    24 
    25 #以上代码执行结果如下:
    26 id(f1) = 42081272 ,id(f2) = 42081408 ,False
    27 f1() = 6
    28 f2() = 6

    二.自定义sort函数

    1>.排序问题

    排序问题:
      仿照内奸函数sorted,请自行实现一个sort函数(不使用内建函数)
    
    思路:
      内建函数sorted函数是返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。内自定义sort函数也要实现这个功能。
      新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中。  
    思考:
      sorted函数的实现原理,扩展到map,filter函数的实现原理。

    2>.sort函数实现

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 def sort(iterable,reverse = False):
     8     list_1 = []
     9     for x in iterable:
    10         for index, y in enumerate(list_1):
    11             flag = x > y if reverse else x < y
    12             if flag:                        # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
    13                 list_1.insert(index,x)      # 降序
    14                 break
    15         else:                               # 不大于,说明是最小的,尾部追加
    16                 list_1.append(x)
    17     return list_1
    18 
    19 src = [1,2,5,4,2,3,5,6]
    20 
    21 dest = sort(src)
    22 
    23 print("src = {}".format(src))
    24 print("dest = {}".format(dest))
    25 print("dest = {}".format(sort(src,False)))
    26 print("dest = {}".format(sort(src,True)))
    27 
    28 
    29 
    30 #以上代码执行结果如下:
    31 src = [1, 2, 5, 4, 2, 3, 5, 6]
    32 dest = [1, 2, 2, 3, 4, 5, 5, 6]
    33 dest = [1, 2, 2, 3, 4, 5, 5, 6]
    34 dest = [6, 5, 5, 4, 3, 2, 2, 1]
    版本一
    #!/usr/bin/env python
    #_*_coding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    #EMAIL:y1053419035@qq.com
    
    def comp(a,b,reverse):
        return  a > b if reverse else a < b
    
    def sort(iterable,reverse = False):
        list_1 = []
        for x in iterable:
            for index, y in enumerate(list_1):
                if comp(x,y,reverse):                        # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
                    list_1.insert(index,x)      # 降序
                    break
            else:                               # 不大于,说明是最小的,尾部追加
                    list_1.append(x)
        return list_1
    
    src = [1,2,5,4,2,3,5,6]
    
    dest = sort(src)
    
    print("src = {}".format(src))
    print("dest = {}".format(dest))
    print("dest = {}".format(sort(src,False)))
    print("dest = {}".format(sort(src,True)))
    
    
    
    #以上代码执行结果如下:
    src = [1, 2, 5, 4, 2, 3, 5, 6]
    dest = [1, 2, 2, 3, 4, 5, 5, 6]
    dest = [1, 2, 2, 3, 4, 5, 5, 6]
    dest = [6, 5, 5, 4, 3, 2, 2, 1]
    版本二
     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 def sort(iterable,key = lambda a,b:a<b,reverse = False):
     9     list_1 = []
    10     for x in iterable:
    11         for index, y in enumerate(list_1):
    12             flag = key(x,y) if reverse else key(y,x)
    13             if flag:                        # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
    14                 list_1.insert(index,x)      # 降序
    15                 break
    16         else:                               # 不大于,说明是最小的,尾部追加
    17                 list_1.append(x)
    18     return list_1
    19 
    20 src = [1,2,5,4,2,3,5,6]
    21 
    22 dest = sort(src)
    23 dest2 = sort(src,reverse=True)
    24 
    25 print("src = {}".format(src))
    26 print("dest = {}".format(dest))
    27 print("dest2 = {}".format(dest2))
    28 
    29 
    30 
    31 
    32 #以上代码执行结果如下:
    33 src = [1, 2, 5, 4, 2, 3, 5, 6]
    34 dest = [6, 5, 5, 4, 3, 2, 2, 1]
    35 dest2 = [1, 2, 2, 3, 4, 5, 5, 6]

    三.内建函数-高阶函数

    1>.sorted(iterable[, key][, reverse]) 排序

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 
     9 """
    10 sorted(iterable[, key][, reverse]) 排序
    11     返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
    12 """
    13 
    14 src = [1, 2, 5, 4, 2, 3, 5, 6]
    15 
    16 # 返回新列表
    17 dest = sorted(src,key=lambda x:6-x)
    18 dest2 = sorted(src,key=lambda x:6-x,reverse=True)
    19 
    20 print("src = {}".format(src))
    21 print("dest = {}".format(dest))
    22 print("dest2 = {}".format(dest2))
    23 
    24 
    25 
    26 #以上代码执行结果如下:
    27 src = [1, 2, 5, 4, 2, 3, 5, 6]
    28 dest = [6, 5, 5, 4, 3, 2, 2, 1]
    29 dest2 = [1, 2, 2, 3, 4, 5, 5, 6]

    2>.filter(function, iterable) 过滤

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 """
     8 filter(function, iterable)
     9     过滤可迭代对象的元素,返回一个迭代器
    10     function一个具有一个参数的函数,返回bool
    11 """
    12 
    13 src = [1,9,55,150,-3,78,28,123]
    14 
    15 #例如,过滤出数列中能被3整除的数字
    16 dest = list(filter(lambda x: x%3==0,src))
    17 
    18 
    19 print("src = {}".format(src))
    20 print("dest = {}".format(dest))
    21 
    22 
    23 
    24 #以上代码执行结果如下:
    25 src = [1, 9, 55, 150, -3, 78, 28, 123]
    26 dest = [9, 150, -3, 78, 123]

    3>. map(function, *iterables) --> map object

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 """
     9 map(function, *iterables) --> map object
    10     对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
    11 """
    12 
    13 
    14 print(list(map(lambda x:2*x+1, range(5))))
    15 
    16 print(dict(map(lambda x:(x%5,x) , range(500))))
    17 
    18 
    19 
    20 #以上代码执行结果如下:
    21 [1, 3, 5, 7, 9]
    22 {0: 495, 1: 496, 2: 497, 3: 498, 4: 499}

    四.柯里化Curing

    1>.柯里化概述

      指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
    
      z
    = f(x, y) 转换成z = f(x)(y)的形式

    2>.通过嵌套函数就可以把函数转换成柯里化函数

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 def add(x, y):
     8     return x + y
     9 
    10 
    11 #将加法函数柯里化,转换如下,即:通过嵌套函数就可以把函数转换成柯里化函数
    12 def add2(x):
    13     def _add(y):
    14         return x+y
    15     return _add
    16 
    17 print(add(10,20))           #普通函数
    18 
    19 print(add2(10)(20))         #柯里化函数
    20 
    21 
    22 
    23 #以上代码执行结果如下:
    24 30
    25 30
  • 相关阅读:
    mongodb管理命令
    面试阿里巴巴前端开发工程师电话面试部分
    前端常用性能优化方法
    面试阿里巴巴前端开发工程师笔试部分
    javascript 实现无重复字符的最长子串
    自定义 Flutter 插件(flutter_3des_plugin)步骤,以及上传插件的那些坑。
    Flutter 实现 3des 加密
    flutter 优雅的版本更新处理
    flutter_blue 蓝牙插件实战及那些坑
    Flutter 总结apk打包上架问题(keystore,依赖包下载报错,apk文件项目请求报错等)
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10963741.html
Copyright © 2020-2023  润新知