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))

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

  • 相关阅读:
    MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
    Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6
    在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。
    PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
    Windows下PHP版本选取
    简单配置nginx使之支持pathinfo
    PHP如何关闭notice级别的错误提示
    php开启pathinfo 模式
    php 5.3新增的闭包语法介绍function() use() {}
    Object.prototype.toString.call() 区分对象类型
  • 原文地址:https://www.cnblogs.com/xzkzzz/p/11365180.html
Copyright © 2011-2022 走看看