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的web.py框架实现类似Django的ORM查询的教程
May 02 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
Python装饰器用法实例总结
May 26 Python
Python3实现转换Image图片格式
Jun 21 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python关闭占用端口方式
Dec 17 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
Python关于反射的实例代码分享
Feb 20 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 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正则匹配汉字的方法介绍
2013/04/25 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
JS验证码实现代码
2017/09/14 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
图解javascript作用域链
2019/05/27 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python避免死锁方法实例分析
2015/06/04 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
python编程使用协程并发的优缺点
2018/09/20 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
python3 enum模块的应用实例详解
2019/08/12 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
营销与策划应届生求职信
2013/11/04 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
农行心得体会
2014/09/02 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
2014年科研工作总结
2014/12/03 职场文书
个人自荐书怎么写
2015/03/26 职场文书
深入理解python协程
2021/06/15 Python
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL