Python 大家都该知道的高阶函数

函数式编程现在逐渐被广大开发群体接受,越来越多的开发者们开始使用这种优雅的开发模式,而我们使用函数式编程最主要的是需要清楚:

  • 什么是高阶函数(Higher-order Functions)?
  • Python 中高阶函数有哪些?要怎么用?

高阶函数概念

在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数。

举个例子

def high_func(f, arr): return [f(x) for x in arr]

上面的例子中, high_func 就是一个高阶函数。其中第一个参数 f 是一个函数,第二个参数 arr 是一个数组,返回的值是数组中的所有的值在经过 f 函数计算后得到的一个列表。例如:

from math import factorialdef high_func(f, arr): return [f(x) for x in arr]def square(n): return n ** 2# 使用python自带数学函数print(high_func(factorial, list(range(10))))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]# 使用自定义函数print(high_func(square, list(range(10))))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Python 常用高阶函数

如同 java、scala 等语言,我们很多常用的高阶函数基本都一致。在开发中我们经常使用的最基本的高阶函数其实就几个,而我们也可以基于这些函数去进行适当的扩展,那么下面开始介绍几种常用的高阶函数。

map

Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted.

根据提供的函数对指定序列做映射, 并返回映射后的序列,定义:

map(func, *iterables) –> map object

  • function # 序列中的每个元素需要执行的操作, 可以是匿名函数
  • *iterables # 一个或多个序列

正如前面所举的例子 high_func 函数, map 函数是 high_func 函数高阶版,可以传入一个函数和多个序列。

from math import factorialdef square(n): return n ** 2# 使用python自带数学函数facMap = map(factorial, list(range(10)))print(list(facMap))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]# 使用自定义函数squareMap = map(square, list(range(10)))print(list(squareMap))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

可以看到输出了同样的结果,只是与 python2.X 不同的是, python3.X 中返回 map 类 ,而前者直接返回一个列表。

我们使用匿名函数,也可以传入多个序列,如下图

# 使用匿名函数lamMap = map(lambda x: x * 2, list(range(10)))print(list(lamMap))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]# 传入多个序列mutiMap = map(lambda x, y: x+y, list(range(10)), list(range(11, 15)))print(list(mutiMap))# print out: [11, 13, 15, 17]

reduce

Apply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.

大致上来讲, reduce 函数需要传入一个有两个参数的函数,然后用这个函数从左至右顺序遍历序列并生成结果,定义如下:

reduce(function, sequence[, initial]) -> value

  • function # 函数, 序列中的每个元素需要执行的操作, 可以是匿名函数
  • sequence # 需要执行操作的程序列
  • initial # 可选,初始参数

最后返回函数的计算结果, 和初始参数类型相同

简单举个例子:

# 注意,现在 reduce() 函数已经放入到functools包中。from functools import reduceresult = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])print(result)# print out 15

我们可以看到,序列 [1, 2, 3, 4, 5] 通过匿名函数进行了累加。

设定初始值:

# 设定初始参数:s = reduce(lambda x, y: x + y, [‘1’, ‘2’, ‘3’, ‘4’, ‘5’], “数字 = “)print(s)# print out: 数字 = 12345

需要注意的是:序列数据类型需要和初始参数一致。

filter

Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.

filter() 函数用来过滤序列中不符合条件的值,返回一个迭代器,该迭代器生成那些函数(项)为 true 的 iterable 项。如果函数为 None,则返回为 true 的项。定义如下:

filter(function or None, iterable) –> filter object

  • function or None # 过滤操作执行的函数
  • iterable # 需要过滤的序列

举个例子:

def boy(n): if n % 2 == 0: return True return False# 自定义函数filterList = filter(boy, list(range(20)))print(list(filterList))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]# 自定义函数filterList2 = filter(lambda n: n % 2 == 0, list(range(20)))print(list(filterList2))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

上面我们可以看到,列表中不能被 2 整除的数据都被排除了。

sorted

Return a new list containing all items from the iterable in ascending order.

A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order.

sorted 函数默认将序列升序排列后返回一个新的新的 list,还可以自定义键函数来进行排序,也可以设置 reverse 参数确定是升序还是降序,如果 reverse = True 则为降序。函数定义如下:

def sorted(iterable: Iterable[_T], *, key: Optional[Callable[[_T], Any]] = …, reverse: bool = …) -> List[_T]: …

  • iterable # 序列
  • key # 可以用来计算的排序函数。
  • reverse # 排序规则,reverse = True 降序,reverse = False 升序(默认)。

举个简单的例子:

list01 = [5, -1, 3, 6, -7, 8, -11, 2]list02 = [‘apple’, ‘pig’, ‘monkey’, ‘money’]print(sorted(list01))# print out: [-11, -7, -1, 2, 3, 5, 6, 8]print(sorted(list01, key=abs))# print out: [-1, 2, 3, 5, 6, -7, 8, -11]# 默认升序print(sorted(list02))# print out: [‘apple’, ‘money’, ‘monkey’, ‘pig’]# 降序print(sorted(list02, reverse=True))# print out: [‘pig’, ‘monkey’, ‘money’, ‘apple’]# 匿名函数排序print(sorted(list02, key=lambda x: len(x), reverse=True))# print out: [‘monkey’, ‘apple’, ‘money’, ‘pig’]

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

  • 原神:申鹤可以和优菈配队吗?当然可以,理论上来说,堪称绝配

    哈喽,大家好,我是拾柒。 导读: 众所周知,申鹤是2.4版本上架的一个冰元素辅助角色。她的出现,拉开了冰元素纯色队的序幕。当然,也算是结束了“铁打的辅助,流水的C”的时代……不过,…

    2022年7月29日
  • 这才是开发者神器正确的打开方式

    DevWeekly收集整理每周优质开发者内容,包括开源项目、工具资源、技术文章等方面,每周五首发于DevWeekly(https://github.com/Jackpopc/Dev…

    2022年7月25日
  • 游戏开发之音效升级

    游戏开发都会涉及到音效,那么用什么格式的音频文件合适,考虑到音效文件一般都不会太大,使用无损编码pcm最合适,不用解压,接口也简单。文件封装格式选择wav,方便调试播放。 音效来源…

    2022年7月31日
  • 信锐设备怎么实现wifi短信上网认证

    设置说明 本文为针对信锐网络控制系统软件设置互亿无线短信发送的说明。 使用方法 在点击左侧菜单“系统管理-> 短信服务”中进行参数配置,配置信息如下: 发送模板:…

    2022年8月17日
  • Python 入门指南之使用 Python 解释器

    2. 使用 Python 解释器 2.1. 调用 Python 解释器 Python 解释器通常被安装在目标机器的 /usr/local/bin/python3.5 目录下。将 /…

    2022年7月14日
  • 最新消息华为科技最新专利申请,两台手机可以实现屏幕联动

    最近,华为技术有限公司向国家知识产权局提交了新的专利,专利内容主要为“第一电子设备向第二电子设备发送第一设备的共享界面数据,第二电子设备接收并显示对应的第二共享界面,同时开启联动模…

    2022年6月23日
  • 也许是目前最HiFi的硬盘播放机,ZIDOO NEO Alpha试用评测

    你觉得对于一个重度家庭影院和HiFi音响爱好者来说,理想中最佳的播放机应该是什么形态? 1、首先外观得漂亮吧,不能看着添堵; 2、做工、用料不能含糊,我都舍得花钱了,当然要物有所值…

    2022年6月17日
  • LeetCode环形链表

    已知一个链表的头结点head,判断链表中是否有环 思路:快慢指针。定义两个指针,一个指针每次只移动一步,另一个指针每次移动两步,如果是环形链表,两个指针肯定会相遇,那么该链表就是环…

    2022年6月30日
  • 王者荣耀:操作最难的三个英雄,快来看看有没有你的本命

    在王者荣耀当中的英雄肯定各领风骚,但是大部分英雄还是在一个框架创作出来,也就造成有一部分英雄的操作会花里胡哨,一部分英雄无脑操作,那么今天小编盘点的三名蒂花之秀英雄,看看有没有你的…

    2022年9月21日
  • AG3-1战胜VG,一诺和未央真的C,半只脚踏进季后赛

    KPL夏季赛常规赛最后一周,成都AG超玩会对阵厦门VG。这场比赛对于双方来说都是不容有失的,因为关乎季后赛名额,还将决定着世冠选拔赛的资格。此前AG超玩会虽然输给了hero,但是明…

    2022年8月12日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息