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倍之多。厦门叉车修理公司

转载于:https://www.cnblogs.com/xyou/p/9086703.html

Python函数式编程中map()、reduce()和filter()函数的用法相关推荐

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

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

  2. Python函数式编程,map/reduce,filter和sorted

    什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...

  3. Python函数式编程-map()、zip()、filter()、reduce()、lambda()

    三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str map函数 map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function, seq ...

  4. 2. Python函数式编程中的字符串,元组,函数的分类,高阶函数,一篇文章都介绍一遍

    函数式编程中的字符串 在函数式编程中,经常用到 Python 字符串,因其是不可变数据结构. 字符串本身是一个对象,具备很多对象方法,与常识中函数的使用不太相同,例如下述代码 my_str = &qu ...

  5. Python函数式编程简介(二)返回函数

    本文为Python函数式编程的第二部分主要讲解返回函数和闭包 2.返回函数 2.1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常 ...

  6. 王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()

    转载请注明出处:王亟亟的大牛之路 首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!! 本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈) 今天上的是关于Pyt ...

  7. Python函数式编程指南(二):函数

    这是此系列的第二篇,试图说明在Python中如何更好地使用函数并引导诸位使用函数式的思维进行思考.掌握并应用这些内容,就已经是至少形似的函数式风格的代码了,至于思维么,这个真靠自己. 作者水平有限,如 ...

  8. Python函数式编程简介(三)匿名函数

    3.匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x^2时,除了定义一个f ...

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

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

最新文章

  1. 【图解】最流行的7个JavaScript 框架各自的优点
  2. 问卷星调查学生对《算法》教学的建议与反馈
  3. NGUI全面实践教程(大学霸内部资料)
  4. bin/...的访问被拒绝被拒绝的问题
  5. LeTax报错之 Incomplete \iffalse
  6. 三维重建:***三维模型的网格细化
  7. linux 删除文件_Linux删除文件夹命令有哪些
  8. Django的url反向解析
  9. 不写代码,可视化堪比python,领导满意的报表工具,原来是这样?
  10. PHP中select框不同用户登录,首页登录后怎么在首页显示用户名以及隐藏登录框?...
  11. 在Ubuntu上安装Hadoop(单机模式)步骤
  12. 04_数字的处理方法(保留小数点两位、将数字转化为千分位格式)
  13. 绝对引用计算机几级,计算机一级必考的14个Excel函数,让我来告诉你
  14. linux spdbv教程,计算机化学实践基础教程
  15. 磁盘分区助手使用心得
  16. 高中数学如何考120以上高中数学如何快速提高
  17. java B2B2C springmvc mybatis仿淘宝电子商城系统-服务消费者(rest+ribbon)
  18. 【数据标准】数据指标体系建立
  19. H5页面唤起微信等app
  20. flutter doctor --android-licenses命令之后出现JAVA_HOME错误

热门文章

  1. git gui怎么拉取项目代码_Git GUI使用方法【转】
  2. sqlserver int转varchar_SQL server 常用数据类型讲解
  3. 常用的排序算法的时间复杂度和空间复杂度 .
  4. 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
  5. 单片机产生可调方波(c语言),单片机产生占空比可调方波(PWM)
  6. java 状态机_基于 RAFT 一致性算法的 Java 实现 SOFAJRaft
  7. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战
  8. Java怎么重复使用套接字_在java中连续地通过套接字传输数据
  9. android app.build文件_网易友品 Android 客户端组件化演进
  10. c#求三角形面积周长公式_此题求三角形的面积,多数学生完全没思路,解题关键是用该知识点...