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模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
python实现年会抽奖程序
Jan 22 Python
对Python实现累加函数的方法详解
Jan 23 Python
pip指定python位置安装软件包的方法
Jul 12 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php+highchats生成动态统计图
2014/05/21 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
php 可变函数使用小结
2018/06/12 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
在Django中创建第一个静态视图
2015/07/15 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
Python PIL图片添加字体的例子
2019/08/22 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
应届大专毕业生自我鉴定
2014/04/08 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
股东授权委托书范本
2014/09/13 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书