详解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获取Ping结果示例代码
Jul 06 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
django2.0扩展用户字段示例
Feb 13 Python
python实现AES和RSA加解密的方法
Mar 28 Python
django 通过URL访问上传的文件方法
Jul 28 Python
Python内置加密模块用法解析
Nov 25 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
Python实现计算图像RGB均值方式
Jun 04 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
python实现过滤敏感词
May 08 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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/11/26 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
强制设为首页代码
2006/06/19 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
学习ExtJS border布局
2009/10/08 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Python实现爬取逐浪小说的方法
2015/07/07 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
python实现textrank关键词提取
2018/06/22 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
银行会计财务工作个人的自我评价
2013/10/29 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
师德师风个人反思
2014/04/28 职场文书
车间核算员岗位职责
2014/07/01 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers