提起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的余数,那么可以写成下面的代码。

Python函数式编程之map使用(一个seq)

Python

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循环,依次对每个位置执行该函数。

Python函数式编程之map使用(多个seq)

Python

1
print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6] )  # [4, 10, 18]

上面是返回值是一个值的情况,实际上也可以是一个元组。下面的代码不止实现了乘法,也实现了加法,并把积与和放在一个元组中。

Python函数式编程之map使用(多个seq)

Python

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()了。

Python函数式编程之map使用(func为None)

Python

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实现一个阶乘的代码。

Python函数式编程之reduce使用

Python

1
2

n = 5
print reduce(lambda x, y: x * y, range(1, n + 1))  # 120

那么,如果我们希望得到2倍阶乘的值呢?这就可以用到init这个可选参数了。

Python函数式编程之reduce使用

Python

1
2
3

m = 2
n = 5
print reduce( lambda x, y: x * y, range( 1, n + 1 ), m )  # 240

Python函数式编程——map()、reduce()相关推荐

  1. Python函数式编程-map/reduce

    1.map map()传入的第一个参数是f,即函数对象本身. map()函数接收两个参数,一个是函数,一个是Interable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...

  2. Python 函数式编程Map、Reduce

    在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算.它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架. ...

  3. 函数式编程Map()Reduce()

    1.forEach():每个元素都调用指定函数,可传三个参数:数组元素丶元素索引丶数组本身丶var a = [1, 2, 3, 4, 5, 6, 7, 8]; a.forEach(function(v ...

  4. Python函数式编程:map/reduce

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作为一种抽象程度极高的编程范式,函数式编程的最大特点就是允许函数本 ...

  5. 函数式编程语言python-10分钟学会python函数式编程

    原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...

  6. python函数式编程读取数据-python学习笔记9:函数式编程

    函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言: LISP, Haskell Py ...

  7. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. Python函数式编程简介(一)高阶函数

    本文概括介绍Python函数式编程的一些概念及用法,详细请参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df ...

  9. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

最新文章

  1. 剖析 Linux hypervisor
  2. Swoft 源码剖析 - Swoft 中的注解机制
  3. Oracle Sql 语法收集.
  4. 童话镇计算机乐谱,童话镇简谱(歌词)-陈一发演唱-桃李醉春风记谱
  5. 在离线环境中发布.NET Core至Windows Server 2008
  6. Mac latex vscode配置外部PDF阅读器并配置对应跳转
  7. IntelliJ IDEA 2018 设置代码提示对大小写不敏感
  8. android 动态设置priority,Android属性之android:priority
  9. 微信公众号前端html,微信公众号开发(前端)
  10. java子类继承父类变量_JAVA子类继承父类
  11. ios逆向工具theos tweak make编译错误集合
  12. 【VOLTE】【SRVCC】【1】 VOLTE SRVCC(SRVCC TO 3GPP)
  13. tomcat的夏时令问题(时区问题)
  14. 基于android平台的语音机器人服务娱乐系统
  15. vue设置页面背景色
  16. 几种mos管驱动电路
  17. 三元运算符(三目运算符)
  18. 大型网站seo布局怎么做
  19. 睿慕课点云第二章报错及解决(二)
  20. 【从零开始JavaEE课设】《影院系统》成品展示——后台管理系统

热门文章

  1. 【Android 逆向】Android 系统文件分析 ( 外部存储设备文件 | sbin 命令程序目录 | dev 字符设备目录 )
  2. 【错误记录】Android Studio 编译报错 ( SDK location not found )
  3. 【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )
  4. 【Android 安全】DEX 加密 ( Application 替换 | 分析 Service 组件中调用 getApplication() 获取的 Application 是否替换成功 )
  5. 【错误记录】Flutter 应用运行卡在 Running Gradle task ‘assembleDebug‘... ( 配置阿里云 Maven 仓库镜像 )
  6. 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
  7. 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )
  8. 设计模式-Strategy模式
  9. [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用
  10. saltstack(八):saltstack配置管理-安装配置启动tomcat样例