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实现的下载8000首儿歌的代码分享
Nov 21 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
Python中字符串对齐方法介绍
May 21 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python实现七段数码管和倒计时效果
Nov 23 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python基于Tkinter实现的记事本实例
2015/06/17 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Django密码系统实现过程详解
2019/07/19 Python
详解pandas映射与数据转换
2021/01/22 Python
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
国际书籍零售商:Wordery
2017/11/01 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
Servlet面试题库
2015/07/18 面试题
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
2014年民警工作总结
2014/11/25 职场文书
汽车转让协议书
2015/01/29 职场文书
矛盾论读书笔记
2015/06/29 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
解决Redis启动警告问题
2022/02/24 Redis
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android