Python函数式编程——map()、reduce()
提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年Apache的Hadoop项目[2]正式将MapReduce纳入到项目中。
好吧,闲话少说,今天要介绍的是Python函数式编程中的另外两个内建函数map()
和reduce()
,而不是Google的MapReduce。
1.map()
格式:map( func, seq1[, seq2...] )
Python函数式编程中的map()
函数是将func作用于seq中的每一个元素,并用一个列表给出返回值。如果func为None,作用同zip()
。
当seq只有一个时,将func函数作用于这个seq的每个元素上,得到一个新的seq。下图说明了只有一个seq的时候map()函数是如何工作的(本文图片来源:《Core Python Programming (2nd edition)》)。
可以看出,seq中的每个元素都经过了func函数的作用,得到了func(seq[n])组成的列表。
下面举一个例子进行说明。假设我们想要得到一个列表中数字%3的余数,那么可以写成下面的代码。
1
2
3
4
5
6
|
# 使用map
print map( lambda x: x%3, range(6) ) # [0, 1, 2, 0, 1, 2]
#使用列表解析
print [x%3 for x in range(6)] # [0, 1, 2, 0, 1, 2]
|
这里又和上次的filter()
一样,使用了列表解析的方法代替map执行。那么,什么时候是列表解析无法代替map的呢?
原来,当seq多于一个时,map可以并行地对每个seq执行如下图所示的过程:
也就是说每个seq的同一位置的元素在执行过一个多元的func函数之后,得到一个返回值,这些返回值放在一个结果列表中。
下面的例子是求两个列表对应元素的积,可以想象,这是一种可能会经常出现的状况,而如果不是用map的话,就要使用一个for循环,依次对每个位置执行该函数。
1
|
print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6] ) # [4, 10, 18]
|
上面是返回值是一个值的情况,实际上也可以是一个元组。下面的代码不止实现了乘法,也实现了加法,并把积与和放在一个元组中。
1
|
print map( lambda x, y: ( x * y, x + y), [1, 2, 3], [4, 5, 6] ) # [(4, 5), (10, 7), (18, 9)]
|
还有就是上面说的func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()
了。
1
2
3
|
print map( None, [1, 2, 3], [4, 5, 6] ) # [(1, 4), (2, 5), (3, 6)]
print zip( [1, 2, 3], [4, 5, 6] ) # [(1, 4), (2, 5), (3, 6)]
|
需要注意的是,不同长度的多个seq是无法执行map函数的,会出现类型错误。
2.reduce()
格式:reduce( func, seq[, init] )
reduce函数即为化简,它是这样一个过程:每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。
简单来说,可以用这样一个形象化的式子来说明:
reduce( func, [1, 2,3] ) = func( func(1, 2), 3)
下面是reduce函数的工作过程图:
举个例子来说,阶乘是一个常见的数学方法,Python中并没有给出一个阶乘的内建函数,我们可以使用reduce实现一个阶乘的代码。
1
2
|
n = 5
print reduce(lambda x, y: x * y, range(1, n + 1)) # 120
|
那么,如果我们希望得到2倍阶乘的值呢?这就可以用到init这个可选参数了。
1
2
3
|
m = 2
n = 5
print reduce( lambda x, y: x * y, range( 1, n + 1 ), m ) # 240
|
Python函数式编程——map()、reduce()相关推荐
- Python函数式编程-map/reduce
1.map map()传入的第一个参数是f,即函数对象本身. map()函数接收两个参数,一个是函数,一个是Interable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...
- Python 函数式编程Map、Reduce
在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算.它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架. ...
- 函数式编程Map()Reduce()
1.forEach():每个元素都调用指定函数,可传三个参数:数组元素丶元素索引丶数组本身丶var a = [1, 2, 3, 4, 5, 6, 7, 8]; a.forEach(function(v ...
- Python函数式编程:map/reduce
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作为一种抽象程度极高的编程范式,函数式编程的最大特点就是允许函数本 ...
- 函数式编程语言python-10分钟学会python函数式编程
原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...
- python函数式编程读取数据-python学习笔记9:函数式编程
函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言: LISP, Haskell Py ...
- python编写函数_浅谈Python 函数式编程
匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...
- Python函数式编程简介(一)高阶函数
本文概括介绍Python函数式编程的一些概念及用法,详细请参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df ...
- python采用函数编程模式_浅谈Python 函数式编程
匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...
最新文章
- 剖析 Linux hypervisor
- Swoft 源码剖析 - Swoft 中的注解机制
- Oracle Sql 语法收集.
- 童话镇计算机乐谱,童话镇简谱(歌词)-陈一发演唱-桃李醉春风记谱
- 在离线环境中发布.NET Core至Windows Server 2008
- Mac latex vscode配置外部PDF阅读器并配置对应跳转
- IntelliJ IDEA 2018 设置代码提示对大小写不敏感
- android 动态设置priority,Android属性之android:priority
- 微信公众号前端html,微信公众号开发(前端)
- java子类继承父类变量_JAVA子类继承父类
- ios逆向工具theos tweak make编译错误集合
- 【VOLTE】【SRVCC】【1】 VOLTE SRVCC(SRVCC TO 3GPP)
- tomcat的夏时令问题(时区问题)
- 基于android平台的语音机器人服务娱乐系统
- vue设置页面背景色
- 几种mos管驱动电路
- 三元运算符(三目运算符)
- 大型网站seo布局怎么做
- 睿慕课点云第二章报错及解决(二)
- 【从零开始JavaEE课设】《影院系统》成品展示——后台管理系统
热门文章
- 【Android 逆向】Android 系统文件分析 ( 外部存储设备文件 | sbin 命令程序目录 | dev 字符设备目录 )
- 【错误记录】Android Studio 编译报错 ( SDK location not found )
- 【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 Service 组件中调用 getApplication() 获取的 Application 是否替换成功 )
- 【错误记录】Flutter 应用运行卡在 Running Gradle task ‘assembleDebug‘... ( 配置阿里云 Maven 仓库镜像 )
- 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
- 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )
- 设计模式-Strategy模式
- [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用
- saltstack(八):saltstack配置管理-安装配置启动tomcat样例