Python 高阶函数、柯里化


这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/107858057
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!


写在开头的话

  • 请记住:实践是掌握知识的最快方法
  • 如果你只是怀着看看的态度去快速浏览文章,而不去认认真真的把文章里面讲的任何一个知识点去实践一遍,那么你永远也掌握不了它
  • 生命不息,折腾不止!

Python 高阶函数、柯里化

00. 高阶函数概念

  • First Class Object
    • 函数在Python中是一等公民
    • 函数也是对象,可调用的对象
    • 函数可以作为普通变量、参数、返回值等等
  • 高阶函数
    • 数学概念 y=g(f(x))
    • 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
      • 接受一个或多个函数作为参数
      • 输出一个函数

  • 写一个函数实现程序的计数功能
def couter(base):
    def inc(step=1):
        nonlocal base
        base += step
        return base
    return inc


if __name__ == "__main__":
    foo = couter(10)
    foo1 = couter(10)
    print("foo1 is foo:", foo1 is foo)
    print("foo1(1):", foo1(1))
    print("foo1(1):", foo1(1))
    print("foo(1):", foo(1))
    print("fo0(1):", foo(1))

上面的foo1foo,每次往其中加入一个参数,那么就自动的加上这个参数。foofoo1不相等。因为它们引用的是不同函数里面的counter函数


01. 自定义sort函数

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

  • 代码演示
def my_sort(iterable, key=lambda a,b:a<b, reverse=False):
    ret = []
    for i in iterable:
        for j, k in enumerate(ret):
            flag = key(k, i) if reverse else key(i, k)
            if flag:
                ret.insert(j, i)
                break
        else:
            ret.append(i)
    return ret

if __name__ == "__main__":
    list1 = [1, 4, 6, 7, 8, 9]
    tuple1 = (3, 5, 6, 7, 8, 9)
    print(tuple(list1))
    print(list(tuple1))
    print(my_sort(list1))
    print(my_sort(list1, reverse=True))
  • 运行结果
(1, 4, 6, 7, 8, 9)
[3, 5, 6, 7, 8, 9]
[1, 4, 6, 7, 8, 9]
[9, 8, 7, 6, 4, 1]

  • 我的思路
  1. 自定义一个函数,函数参数能够接收可迭代元素、和reverse值的设置,同时可迭代元素是什么类型,便返回什么类型。
  2. 函数内部自己冒泡排序,然后根据reverse的值,自己决定冒泡排序的比较方式
  3. 返回一个新的可迭代元素,对原来的可迭代元素不做修改
  • 演示代码
import copy

def my_sorted(iterable_arg, reverse=False):
    iterable = copy.deepcopy(iterable_arg)
    is_tuple = False
    if type(iterable) is tuple:
        iterable = list(iterable)
        is_tuple = True
    for i in range(len(iterable)):
        for j in range(1, len(iterable) - i):
            if not reverse:
                if iterable[j-1] > iterable[j]:
                    iterable[j], iterable[j - 1] = iterable[j - 1], iterable[j]
            else:
                if iterable[j - 1] < iterable[j]:
                    iterable[j], iterable[j - 1] = iterable[j - 1], iterable[j]
    if is_tuple:
        return tuple(iterable)
    else:
        return iterable


if __name__ == "__main__":
    print(my_sorted([12, 56, 78, 89, 34, 1, 88, 23, 4]))
    print(my_sorted((1, 0, 3,  -1, 90, 23, 89, 10)))
    print(my_sorted((1, 0, 3,  -1, 90, 23, 89, 10), reverse=True))
  • 运行结果
[1, 4, 12, 23, 34, 56, 78, 88, 89]
(-1, 0, 1, 3, 10, 23, 89, 90)
(90, 89, 23, 10, 3, 1, 0, -1)

02. 内建函数-高阶函数

  • sorted(iterable[, key][, reverse])
    • 排序
    • 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
  • filter(function, iterable) --> filter object
    • 过滤数据
  • map(func, *iterables) --> map object
    • 映射

  • filter(function, iterable)
    • 过滤可迭代对象的元素,返回一个迭代器
    • function,具有一个参数的函数,返回bool
  • 例如,过滤出数列中能被3整除的数字
  • list(filter(lambda x: x%3==0, [1,9,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)))

  • 内建函数的演示代码
print(list(filter(lambda x: x % 3 == 0, [23, 12, 56, 12, 90, 3, 2, 5, 8])))
print(list(map(lambda x:4*x+1, range(10))))
print(dict(map(lambda x:("x"+str(x), 2*x+1), range(10))))

  • 运行结果
[12, 12, 90, 3]
[1, 5, 9, 13, 17, 21, 25, 29, 33, 37]
{'x0': 1, 'x1': 3, 'x2': 5, 'x3': 7, 'x4': 9, 'x5': 11, 'x6': 13, 'x7': 15, 'x8': 17, 'x9': 19}

03. 柯里化Currying

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

  • 举例
    • 将加法函数柯里化
def add(x, y): 
    return x + y

  • 举例
    • 将加法函数柯里化
def add(x, y):
    return x + y

  • 转换如下
def add(x):
    def _add(y):
        return x+y
    return _add
add(5)(6)

  • 举例
    • 将下列加法函数柯里化
def num_add(x=0, y=0, z=0):
    return x+y+z

  • 转换如下
def add(x):
    def _add(y):
        def _add1(z):
            return x+y+z
        return _add1
    return _add


写在最后的话:

  • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
  • 欢迎关注我的CSDN博客,IDYS’BLOG
  • 持续更新内容
    linux基础 | 数据通信(路由交换,WLAN) | Python基础 | 云计算
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值