Python中的特殊语法:filter、map、reduce、lambda介绍


Posted in Python onApril 14, 2015

filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 

>>> filter(f, range(2, 25)) 

[5, 7, 11, 13, 17, 19, 23]

>>> def f(x): return x != 'a' 

>>> filter(f, "abcdef") 

'bcdef'

map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:

>>> def cube(x): return x*x*x 

>>> map(cube, range(1, 11)) 

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def cube(x) : return x + x 

... 

>>> map(cube , "abcde") 

['aa', 'bb', 'cc', 'dd', 'ee']

另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
>>> def add(x, y): return x+y 

>>> map(add, range(8), range(8)) 

[0, 2, 4, 6, 8, 10, 12, 14]

reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:

>>> def add(x,y): return x + y 

>>> reduce(add, range(1, 11)) 

55 (注:1+2+3+4+5+6+7+8+9+10)

>>> reduce(add, range(1, 11), 20) 

75 (注:1+2+3+4+5+6+7+8+9+10+20)

lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:

>>> g = lambda x: x * 2 

>>> g(3) 

6 

>>> (lambda x: x * 2)(3) 

6

我们也可以把filter map reduce 和lambda结合起来用,函数就可以简单的写成一行。
例如:

kmpathes = filter(lambda kmpath: kmpath,                  

map(lambda kmpath: string.strip(kmpath),

string.split(l, ':')))    

看起来麻烦,其实就像用语言来描述问题一样,非常优雅。
对 l 中的所有元素以':'做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被':'分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤。

---------------------------------------------------------------

lambda表达式返回一个函数对象
例子:

func = lambda x,y:x+y

func相当于下面这个函数

def func(x,y):

    return x+y

注意def是语句而lambda是表达式
下面这种情况下就只能用lambda而不能用def
[(lambda x:x*x)(x) for x in range(1,11)]

map,reduce,filter中的function都可以用lambda表达式来生成!
 
map(function,sequence)
把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。
如果function有两个参数,即map(function,sequence1,sequence2)。
 
例子:
求1*1,2*2,3*3,4*4

map(lambda x:x*x,range(1,5))

返回值是[1,4,9,16]
 
reduce(function,sequence)

function接收的参数个数只能为2
先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给
function,然后只返回一个结果。
 
例子:
求1到10的累加

reduce(lambda x,y:x+y,range(1,11))

返回值是55。
 
filter(function,sequence)

function的返回值只能是True或False
把sequence中的值逐个当参数传给function,如果function(x)的返回值是True,就把x加到filter的返回值里面。一般来说filter的返回值是list,特殊情况如sequence是string或tuple,则返回值按照sequence的类型。
 
例子:
找出1到10之间的奇数

filter(lambda x:x%2!=0,range(1,11))

返回值
[1,3,5,7,9]

 
如果sequence是一个string
filter(lambda x:len(x)!=0,'hello')返回'hello'

filter(lambda x:len(x)==0,'hello')返回''
Python 相关文章推荐
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
python实现图片文件批量重命名
Mar 23 Python
Python版名片管理系统
Nov 30 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
python利用后缀表达式实现计算器功能
Feb 22 Python
利用python调用摄像头的实例分析
Jun 07 Python
详解Python中for循环的使用
Apr 14 #Python
Python中join和split用法实例
Apr 14 #Python
Python中__name__的使用实例
Apr 14 #Python
Python中的列表知识点汇总
Apr 14 #Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 #Python
复习Python中的字符串知识点
Apr 14 #Python
Python内置函数dir详解
Apr 14 #Python
You might like
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php读取3389的脚本
2014/05/06 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
农历与西历对照
2006/09/06 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
Vue实现简易计算器
2020/02/25 Javascript
Python 私有函数的实例详解
2017/09/11 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
一个入门级python爬虫教程详解
2021/01/27 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
大学生就业自荐信
2013/10/26 职场文书
计划生育责任书
2015/05/09 职场文书
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技