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中的进程分支fork和exec详解
Apr 11 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
python:接口间数据传递与调用方法
Dec 17 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
python+tkinter实现学生管理系统
Aug 20 Python
利用python中集合的唯一性实现去重
Feb 11 Python
Django框架models使用group by详解
Mar 11 Python
python实现TCP文件传输
Mar 20 Python
python如何实时获取tcpdump输出
Sep 16 Python
python 如何上传包到pypi
Dec 24 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
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python的slice notation的特殊用法详解
2019/12/27 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
领导干部培训感言
2014/01/23 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
Redis高并发缓存架构性能优化
2022/05/15 Redis