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

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

猜你喜欢

转载自www.cnblogs.com/xzkzzz/p/11365180.html