详解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 相关文章推荐
Python Trie树实现字典排序
Mar 28 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
pandas to_excel 添加颜色操作
Jul 14 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
python中如何使用虚拟环境
Oct 14 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出错界面
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
php遍历数组的方法分享
2012/03/22 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
异步加载script的代码
2011/01/12 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
js获取域名的方法
2015/01/27 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python中的sort方法使用详解
2014/07/25 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
python中web框架的自定义创建
2019/09/08 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python列表切片常用操作实例解析
2020/03/10 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
理想国读书笔记
2015/06/25 职场文书