Python reduce()函数的用法小结


Posted in Python onNovember 15, 2017

reduce()函数也是Python内置的一个高阶函数。

reduce()

格式:

reduce (func, seq[, init()])

reduce()函数即为化简函数,它的执行过程为:每一次迭代,都将上一次的迭代结果(注:第一次为init元素,如果没有指定init则为seq的第一个元素)与下一个元素一同传入二元func函数中去执行。在reduce()函数中,init是可选的,如果指定,则作为第一次迭代的第一个元素使用,如果没有指定,就取seq中的第一个元素。
reduce()函数的执行过程如下图所示:

Python reduce()函数的用法小结

从reduce函数的执行过程,让我们很容易联想到求一个数的阶乘,而Python中并没有给出一个求阶乘的内置函数,正好我们就拿这个例子来说明reduce函数吧。

#未指定init的情况
>>> n = 6
>>> print reduce(lambda x, y: x * y, range(1, n))
120

上面的例子中range(1,6)函数生成的是一个[1, 2, 3, 4, 5]这样的列表,这里我们给它个名叫seq1吧,reduce()函数执行时,由于没有指定init参数,所以将取seq1中的第一个元素1,作为第一个元素,由于前面的lambda有2个变量,所以需要两个实参,于是就取seq1中的第2个元素2,与第一个元素1一起传入lambda中去执行,并将返回结果2,并同下一个元素3再一起传入lambda中执行,再次返回的结果,作为下一次执行的第一个元素,依次类推,就得出结果5! = 120。
如果我们希望得到阶乘的结果再多增加几倍,可以启用init这个可选项。如:

>>> print reduce(lambda x, y: x * y, range(1, n),2)
240

这个时候,就会将init作为第一个元素,和seq1中的第一个元素1一起传入lambda函数中去执行,返回结果再作为下一次的第一个元素。

下面给出的例子更简单一些,大家可以看下

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

例如,编写一个f函数,接收x和y,返回x和y的和:

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

调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。

上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。

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

reduce(f, [1, 3, 5, 7, 9], 100)

结果将变为125,因为第一轮计算是:

计算初始值和第一个元素:f(100, 1),结果为101。

Python 相关文章推荐
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
python3.6数独问题的解决
Jan 21 Python
python操作kafka实践的示例代码
Jun 19 Python
python实现井字棋小游戏
Mar 04 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
python 爬虫如何实现百度翻译
Nov 16 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
python简单实例训练(21~30)
Nov 15 #Python
python下10个简单实例代码
Nov 15 #Python
python获取多线程及子线程的返回值
Nov 15 #Python
python使用threading获取线程函数返回值的实现方法
Nov 15 #Python
python enumerate函数的使用方法总结
Nov 15 #Python
Python set常用操作函数集锦
Nov 15 #Python
python机器学习库常用汇总
Nov 15 #Python
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
jquery实现动态画圆
2014/12/04 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
javascript中数组的常用算法深入分析
2019/03/12 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python 实现归并排序算法
2012/06/05 Python
Python生成密码库功能示例
2017/05/23 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
python爬取微博评论的实例讲解
2021/01/15 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
2015年档案室工作总结
2015/05/23 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
爱的教育读书笔记
2015/06/26 职场文书