zoukankan      html  css  js  c++  java
  • python 高阶函数、柯里化

    高阶函数

    First Class Object

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

    高阶函数

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

    自定义sort函数

    • 排序问题
      • 仿照内建函数sorted,请自行实现一个sort函数。能够为序列元素排序
    • 思路
      • 内建函数sorted函数返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。自定义函数也需要实现这些功能
      • 新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中

    sort函数实现。

     基本思路的实现

    #自定义排序函数:
    def sort(iterate):
        netlist = []
        for x in iterate:
            for i,y in enumerate(netlist):
                if x > y: #找到大的就插入,如果换成x < y 是同样的
                    netlist.insert(i,x)   #降序
                    break   #这个braek 是必须加的,当if条件成立就变成死循环了
            else:   #不大于,说明就是最小的,尾部追加
                netlist.append(x)
        return netlist
    print(sort([1,2,3,45,5,6,8,123]))

    用参数控制升序还是降序

    #自定义排序函数:
    def sort(iterate,reverse=False):
        netlist = []
        for x in iterate:
            for i,y in enumerate(netlist):
                flag = x > y if reverse else x < y  #默认是升序,如果reverse = True 为降序
                if flag:
                    netlist.insert(i,x)
                    break
            else:
                netlist.append(x)
        return netlist
    print(sort([1,2,3,45,5,6,8,123]))

     用lambda函数实现,反转功能

    #自定义排序函数:
    def sort(iterate,reverse=False,key=lambda x,y : x<y):
        netlist = []
        for x in iterate:
            for i,y in enumerate(netlist):
                #flag = x > y if reverse else x < y  #默认是升序,如果reverse = True 为降序
                flag = key(x,y) if not reverse else not key(x,y)
                if flag:
                    netlist.insert(i,x)
                    break
            else:
                netlist.append(x)
        return netlist
    print(sort([1,2,3,45,5,6,8,123],reverse=True))

    内建高阶函数

    sorted(iterable[,key][,reverse])  排序

    • 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否反转
    • sorted(lst,key=lambda x:6-x) #返回新列表
    • list.sort(key=lambda x:6-x) #就地修改

    filter(function,iterable)

    • 过滤可迭代对象的元素,返回一个迭代器
    • function一个具有一个参数的函数,返回bool
    • 例如:过滤出数列中能被3整除的数字  list(filter(lambda x: x%3==0,[1,9,4,55,150,-3,78,28,123]))

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

    • 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
      • list(map(lambda x: 2*x+1,range(5)))
      • dict(map(lambda x: (x%5,x),range(500)))

    函数柯里化

    柯里化

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

    将加法函数柯里化

    #将加法函数柯里化
    #原函数
    #def add1(x,y):
    #    return x+y
    #柯里化函数
    def add(x):
        def _add(y):
            return x+y
        return _add
    print(add(4)(5))

    通过嵌套函数将函数柯里化

  • 相关阅读:
    大咖们如何评判优秀架构师?
    腾讯会议大规模任务调度系统架构设计
    计算压力倍增,携程度假起价引擎架构演变
    快手春节红包背后,高并发存储架构设计
    日均20亿流量:携程机票查询系统的架构升级
    我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程
    OGRE
    CMake
    深入理解C++11【5】
    深入理解C++11【4】
  • 原文地址:https://www.cnblogs.com/xzkzzz/p/11365180.html
Copyright © 2011-2022 走看看