Python函数式编程中map()、reduce()和filter()函数的用法
Python中map()、reduce()和filter()三个函数均是应用于序列的内置函数,分别对序列进行遍历、递归计算以及过滤操作。这三个内置函数在实际使用过程中常常和“行内函数”lambda函数联合使用,我们首先介绍下lambda函数。
1、lambda函数
lambda函数的Python3.x API文档
lambda
An anonymous inline function consisting of a single expression which is evaluated when the function is called. The syntax to create a lambda function is lambda [arguments]: expression
由文档可知,lambda函数是匿名行内函数,其语法为lambda [arguments]: expression,比如:
f = lambda x, y : x * y #定义了函数f(x, y) = x * y
其非匿名函数表达如下:
def f(x, y):
return x * y
2、map()函数
map()函数的Python3.x API文档
map(function, iterable, ...)
Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. With multiple iterables, the iterator stops when the shortest iterable is exhausted. For cases where the function inputs are already arranged into argument tuples, see itertools.starmap().
map()函数的输入是一个函数function以及一个或多个可迭代的集合iterable,在Python 2.x中map()函数的输出是一个集合,Python 3.x中输出的是一个迭代器。map()函数主要功能为对iterable中的每个元素都进行function函数操作,并将所有的返回结果放到集合或迭代器中。function如果是None,则其作用等同于zip()。
例如:
>>> a = map(lambda x, y : x * y, range(3), range(3))
>>> b = list(a)
>>> print(b)
[0, 1, 4]
在Python 2.x中则不需要 b = list(a),因为在Python 2.x中map()函数的输出直接就是一个集合。
map()函数的具体执行过程图如图1所示。

图 1 map()函数的具体执行过程图
由图1可看出,使用map函数时,两个可迭代的集合中的元素可以并行进行计算。
对于两个可迭代的集合的元素个数不一致的情况,map()函数会自动截断更长的那个集合,并只计算两个集合对应的元素,比如:
>>> a = map(lambda x, y : x * y, range(3), range(2))
>>> b = list(a)
>>> print(b)
[0, 1]
3、reduce()函数
reduce()函数的Python3.x API文档
functools.reduce(function, iterable[, initializer])
Apply function of two arguments cumulatively to the items of sequence, from left to right, so as to reduce the sequence to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the sequence. If the optional initializer is present, it is placed before the items of the sequence in the calculation, and serves as a default when the sequence is empty. If initializer is not given and sequence contains only one item, the first item is returned.
reduce()函数的输入是一个函数function、一个可迭代的集合iterable以及一个可选的初始项initializer,输出为一个值。不同于map()函数对序列中的元素进行逐一遍历,reduce()函数对序列中的元素进行递归计算。比如:
>>> from functools import reduce
>>> a = reduce(lambda x, y : x * y, [1, 2, 3])
>>> print(a)
6
在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 functools模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数。
reduce() 函数的具体执行过程图如图2所示。

图2 reduce() 函数的具体执行过程图
由图2可以看出,reduce()函数先将可迭代集合中的前两个元素进行function操作运算,然后将运算结果与第三个元素再进行function操作运算,以此类推,直到迭代完集合中所有的元素,最终返回递归结果。
4、filter()函数
filter()函数的Python3.x API文档
filter(function, iterable)
Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed. Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not Noneand (item for item in iterable if item) if function is None.
See itertools.filterfalse() for the complementary function that returns elements of iterable for which function returns false.
filter()函数的输入为一个函数function和一个可迭代的集合iterable,在Python 2.x中filter()函数的输出是一个集合,Python 3.x中输出的是一个filter类。顾名思义,filter()函数主要是对指定可迭代集合进行过滤,筛选出集合中符合条件的元素。比如:
>>> a = filter(lambda x: x > 3 and x < 6, range(7))
>>> print(a)
<filter object at 0x108bf2390>
>>> b = list(a)
>>> print(b)
[4, 5]
5、map()、reduce()和filter()与for
在Python的函数式编程中的map()、reduce()和filter()函数,均可用for循环来实现,那么为什么还需要map()、reduce()和filter()函数呢?
主要是因为Python的for命令效率不高且复杂,而map()、reduce()和filter()更为高效和简洁,map()、reduce()和filter()的循环速度比Python内置的for或while循环要快得多,其执行速度相当于C语言。
def demo_for():
x = [x for x in range(100000)]
y = [y for y in range(100000)]
result = []
for i in range(100000):
result.append(x[i] + y[i])
return result
def demo_map():
a = map(lambda x, y: x + y, range(100000), range(100000))
return list(a)
在以上的十万个元素的对比计算中,demo_map的执行效率比demo_for的高2倍之多。厦门叉车修理公司
Python函数式编程中map()、reduce()和filter()函数的用法的更多相关文章
- Python函数式编程,map/reduce,filter和sorted
什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...
- Python学习札记(二十一) 函数式编程2 map/reduce
参考:map/reduce Note 1.map():map()函数接收两个参数,一个是函数,一个是Iterable.map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...
- Python“函数式编程”中常用的函数
1.map(func,seq[,seq,...]) 对序列中的每个元素应用函数,python2中map()返回的是列表,python3中返回的是迭代器,可以用list()转换成列表.以下例子为pyth ...
- 转自:Python函数式编程指南(二):函数
2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: 1 2 def add(x, y): return x + y 关于参数和返回值的语法细节可以参考其他文档,这里就略过了. ...
- map,reduce和filter函数
numArray = [1, 2, 3, 4, 5] def ercifang(x): return x ** 2 def map_test(func, numArray): li = [] for ...
- Python函数式编程(一):高级函数
首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
- (转)Python函数式编程——map()、reduce()
转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
随机推荐
- selenium+python unittest实践过程之问题杂集
1.列表选择项后直接获取文本内容获取不到,应该获取选择后显示的button的值 2.取值后的值带有空格,可以使用.strip()删除前后空格,以便断言 3.取值后有些值需要对类型进行转换才能断言成功 ...
- TreeMap实现原理及源码分析之JDK8
转载 Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 一.TreeMap 简单介绍 什么是Map? 在数组中我们通过数组下标来对数组内容进行索引的,而在Map中我们通过对象来对 ...
- Azure云 windows平台 搭建ftp服务器注意事项
1.iis设置防火墙支持端口(1-65535自定义端口,一般3-5个都行) 2.客户端连接使用被动链接模式 3.endpoint终结点添加20,21,以及你自定义的防火墙支持端口. 4.本地防火墙添加 ...
- Metapackage包
Metapackage(功能包集)是把一些相近的功能模块. 软件包放到一起. ROS里常见的Metapacakge有: 2.Metapackage写法 CMakeLists.txt 写法如下: cma ...
- JDBC连接池使用
一:一个服务在操作数据库的操作的时候,连接和关闭资源是很消耗系统的资源,不能再每次用户操作数据库的时候,都需要重新建立连接和 关闭连接. 如果这样操作的话,对系统和用户来说,都会消耗大量的资源.所以操 ...
- Algorithms: Design and Analysis, Part 1 - Programming Assignment #1
自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...
- 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...
- 自学tensorflow——2.使用tensorflow计算线性回归模型
废话不多说,直接开始 1.首先,导入所需的模块: import numpy as np import os import tensorflow as tf 关闭tensorflow输出的一大堆硬件信息 ...
- django的类视图-11
目录 1. 使用类视图 创建类视图 注册路由 类视图使用装饰器 在url中装饰 在类视图中装饰 method_decorator 的 name 参数 使用Mixin扩展类 使用函数方式定义的视图叫函数 ...
- lua io操作(一)
最近在做可视化窗口数据配置 使用的lua 语言,免不了IO操作 通过查阅资料,做了如下总结,易于理解 lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.inp ...