详解Python高阶函数


Posted in Python onAugust 15, 2020

本文要点

1.什么是高阶函数

2.python中有哪些常用的高阶函数

什么是高阶函数?

在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数!

详解Python高阶函数

同理我们将 abs 指向另一个函数 abs = len,那么 abs 将不再是求绝对值的函数了,abs指向的是求长度的 len 函数。这说明函数名其实就是指向函数的变量!

详解Python高阶函数

既然变量可以指向函数,而函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数。下面我们来看一个DEMO。定义一个 add 函数,它接受三个参数 x, y, f,其中 x, y 是数字,f 是一个函数。

def add(x, y, f):
  return f(x) + f(y)

result = add(-12, -98, abs)
print(result)

输出结果:110

上面的 add() 函数就是一个高阶函数,其实高阶函数的概念很简单,能接收函数作参数的函数就是高阶函数。

python中常用的高阶函数

1.map()

map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

例如,对于 list [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果希望把 list 的每个元素都作平方,就可以用 map() 函数:

因此,我们只需要传入函数 f(x)=x * x,就可以利用 map() 函数完成这个计算:

def add(x, y, f):
  return f(x) + f(y)

result = add(-12, -98, abs)
print(result)

输出结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]

注意:map() 函数不改变原有的 list,而是返回一个新的 list。

由于 list 包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

2.reduce()

reduce() 函数接收的参数和 map() 类似,一个函数 f,一个 list,但行为和 map() 不同,reduce() 传入的函数 f 必须接收两个参数,reduce() 对 list 的每个元素反复调用函数 f,并返回最终结果值。

下面我们来看个 demo:

def prod(x, y):
 return x * y


print(reduce(prod, [2, 4, 5, 7, 12]))

输出结果:3360

prod() 函数接收两个参数,返回 x 和 y 的乘积

调用 reduce(prod, [2, 4, 5, 7, 12]) 时,reduce 函数将做如下计算:

先计算头两个元素prod(2, 4)结果为:8,

再把计算结果和第3个元素传给 prod(8, 5) 结果为:40,

再把计算结果和第4个元素传给 prod(40, 7) 结果为:280,

再把计算结果和第5个元素传给 prod(280, 12) 结果为:3360,

由于没有更多元素了,最终返回结果:3360

reduce() 还可以接收第 3 个可选参数,作为计算的初始值。如果把初始值设为 100,计算:

reduce(prod, [2, 4, 5, 7, 12], 100)

结果变为:336000,因为第一轮的计算是:

计算初始值和第一个元素:prod(100, 2),结果为:200。

3.filter()

filter() 又可以叫做过滤函数,它接收一个函数 f 和一个 list,这个函数 f 的作用是对每个元素进行判断,返回 True 或 False,filter() 根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新 list。

例如,要从一个 list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

def is_odd(x):

 if x % 2 == 1:
 return x

然后用 filter() 过滤掉偶数:

print(list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17])))

结果:[1, 7, 9, 17]

利用 filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:

def is_not_empty(s):
 return s and len(s.strip()) > 0

print(list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])))

以上就是详解Python高阶函数的详细内容,更多关于Python高阶函数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
Django卸载之后重新安装的方法
Mar 15 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
python获取array中指定元素的示例
Nov 26 Python
Python values()与itervalues()的用法详解
Nov 27 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
降低python版本的操作方法
Sep 11 Python
Django Form常用功能及代码示例
Oct 13 Python
python爬取招聘要求等信息实例
Nov 20 Python
python 19个值得学习的编程技巧
Aug 15 #Python
解析python 类方法、对象方法、静态方法
Aug 15 #Python
浅谈python锁与死锁问题
Aug 14 #Python
Python3.8安装Pygame教程步骤详解
Aug 14 #Python
Python configparser模块应用过程解析
Aug 14 #Python
PyCharm 2020.2 安装详细教程
Sep 25 #Python
Python logging模块handlers用法详解
Aug 14 #Python
You might like
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
js实现3D旋转相册
2020/08/02 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
学python爬虫能做什么
2020/07/29 Python
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
学生的自我鉴定范文
2013/10/24 职场文书
跟单文员岗位职责
2014/01/03 职场文书
家长给学校的建议书
2014/05/15 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
工厂标语大全
2014/10/06 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
深入理解go缓存库freecache的使用
2022/02/15 Golang
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python