每天一点——python map()和reduce()

转载 2015年11月20日 10:46:35

转自:http://www.pythoner.com/46.html

今天要介绍的是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)》)。

map-一个seq

可以看出,seq中的每个元素都经过了func函数的作用,得到了func(seq[n])组成的列表。

下面举一个例子进行说明。假设我们想要得到一个列表中数字%3的余数,那么可以写成下面的代码。

这里又和上次的filter()一样,使用了列表解析的方法代替map执行。那么,什么时候是列表解析无法代替map的呢?

原来,当seq多于一个时,map可以并行地对每个seq执行如下图所示的过程:

map-多个seq

也就是说每个seq的同一位置的元素在执行过一个多元的func函数之后,得到一个返回值,这些返回值放在一个结果列表中。

下面的例子是求两个列表对应元素的积,可以想象,这是一种可能会经常出现的状况,而如果不是用map的话,就要使用一个for循环,依次对每个位置执行该函数。

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

还有就是上面说的func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()了。

需要注意的是,不同长度的多个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函数的工作过程图:

reduce

举个例子来说,阶乘是一个常见的数学方法,Python中并没有给出一个阶乘的内建函数,我们可以使用reduce实现一个阶乘的代码。

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

相关文章推荐

Python学习(八)——map、reduce、filter、sorted

map map()函数接收两个参数:一个函数,一个序列;map函数将传入函数依次作用于序列的每个元素,把结果作为新的list返回。>>> map(abs,[-12,-8,2,-9,61,-27]) ...
  • akadiao
  • akadiao
  • 2017年08月02日 20:48
  • 85

python中的函数式编程——apply, filter, map, reduce

什么是函数式编程?没有深入了解过,Scala就是函数式编程的语言,暂时可以把lambda当做是函数式编程 python有几个内建函数——apply, filter, map, reduce,这些函数的...

Python函数式编程——map()、reduce()

原文链接 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Googl...

python学习——map/reduce

Python内建了map()和reduce()函数。 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large C...

每天一点python —— 迭代器与生成器

迭代器  迭代器(Iterator)概述 迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。 迭代器不能回退,只能往前进行迭代。这并不是什...
  • zzlzzh
  • zzlzzh
  • 2015年11月20日 09:53
  • 254

每天一点python——缺失值处理

在sklearn的preprocessing包中包含了对数据集中缺失值的处理,主要是应用Imputer类进行处理。 首先需要说明的是,numpy的数组中可以使用np.nan/np.NaN(Not A...
  • zzlzzh
  • zzlzzh
  • 2015年12月02日 16:11
  • 5934

每天一点python——类

转自: 1 名字和对象 对象有其特性,同一个对象可以有多个名字,这与其它语言中的别名很相似。别名有时候像指针,例如将对象当做 函数参数传递的时候非常高效,因为只传递了指针,这避免了pascal中的两...
  • zzlzzh
  • zzlzzh
  • 2015年11月19日 19:41
  • 263

每天一点python——xlrd

一、什么是xlrd xlrd是python语言中读取excel的扩展工具,可以实现指定表单、指定单元格的读取。 二、安装xlrd 官网安装:到python官网http://pypi.pytho...
  • zzlzzh
  • zzlzzh
  • 2015年11月25日 13:02
  • 511

每天一点python —— yield

转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/index.html 如何生成斐波那契數列 斐波...
  • zzlzzh
  • zzlzzh
  • 2015年11月20日 10:23
  • 223

每天一点python——八大排序算法的Python实现

1、插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算...
  • zzlzzh
  • zzlzzh
  • 2015年11月27日 09:59
  • 347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:每天一点——python map()和reduce()
举报原因:
原因补充:

(最多只允许输入30个字)