Python中的map、reduce和filter浅析


Posted in Python onApril 26, 2014

1、先看看什么是 iterable 对象

以内置的max函数为例子,查看其doc:

>>> print max.__doc__
max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value
With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

在max函数的第一种形式中,其第一个参数是一个 iterable 对象,既然这样,那么哪些是 iterable 对象呢?
>>> max('abcx')
>>> 'x'
>>> max('1234')
>>> '4'
>>> max((1,2,3))
>>> 3
>>> max([1,2,4])
>>> 4

我们可以使用yield生成一个iterable 对象(也有其他的方式):
def my_range(start,end):
    ''' '''
    while start <= end:
        yield start
        start += 1

执行下面的代码:
for num in my_range(1, 4):
    print num
print max(my_range(1, 4))

将输出:
1
2
3
4
4

2、map

在http://docs.python.org/2/library/functions.html#map中如此介绍map函数:

map(function, iterable, ...)
Apply function to every item of iterable and return a list of 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. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list.

map函数使用自定义的function处理iterable中的每一个元素,将所有的处理结果以list的形式返回。例如:
def func(x):
    ''' '''
    return x*x
print map(func, [1,2,4,8])
print map(func, my_range(1, 4))

运行结果是:
[1, 4, 16, 64]
[1, 4, 9, 16]

也可以通过列表推导来实现:
print [x*x for x in [1,2,4,8]]

3、reduce

在http://docs.python.org/2/library/functions.html#reduce中如下介绍reduce函数:

reduce(function, iterable[, initializer])
Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable 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 iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned.

这个已经介绍的很明了,
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

相当于计算
((((1+2)+3)+4)+5)

而:
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5],6)

相当于计算
(((((6+1)+2)+3)+4)+5)

4、filter

在http://docs.python.org/2/library/functions.html#filter中如下介绍filter函数:

filter(function, iterable)
Construct a list 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 iterable is a string or a tuple, the result also has that type; otherwise it is always a list. 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 [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None.

参数function(是函数)用于处理iterable中的每个元素,如果function处理某元素时候返回true,那么该元素将作为list的成员而返回。比如,过滤掉字符串中的字符a:
def func(x):
    ''' '''
    return x != 'a'
print filter(func, 'awake')

运行结果是:
wke

这也可以通过列表推导来实现:
print ''.join([x for x in 'awake' if x != 'a'])
Python 相关文章推荐
Python中使用hashlib模块处理算法的教程
Apr 28 Python
python flask实现分页效果
Jun 27 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
PyQt5显示GIF图片的方法
Jun 17 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
python getpass模块用法及实例详解
Oct 07 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
Python实现的Kmeans++算法实例
Apr 26 #Python
爬山算法简介和Python实现实例
Apr 26 #Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 #Python
python实现的二叉树算法和kmp算法实例
Apr 25 #Python
python中的__init__ 、__new__、__call__小结
Apr 25 #Python
Python yield 小结和实例
Apr 25 #Python
python计数排序和基数排序算法实例
Apr 25 #Python
You might like
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
php mysql 封装类实例代码
2016/09/18 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
基python实现多线程网页爬虫
2015/09/06 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
自荐信封面
2013/12/04 职场文书
财会自我鉴定范文
2013/12/27 职场文书
房屋出租协议书
2014/04/10 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
离婚协议书格式
2014/11/21 职场文书
重阳节慰问信
2015/02/15 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书