让我们用filter函数回答
“鱼香肉丝里面有没有鱼呢?”
作者:水...琥珀
编辑:楠楠
引言:
在之前的文章中提到lambda、map函数,今天学习一下与map有“异曲同工”之妙的filter函数。并说明Python2和Python3中这个函数的不同之处。
函数内容:
filter(function or None, sequence),
其中sequence 可以是list ,tuple,string。filter()函数,是用来过滤sequence的,对序列参数 sequence 中的每个元素调用 function 函数,对function结果为false的剔除,最后返回调用结果为True的元素。
Python3代码:
代码块1:
# -*- coding: utf-8 -*-
def IfEven(x): #此函数判读是否是偶数
if x%2 == 0:
return True
else:
return False
mylist=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
resultOne= filter(IfEven,mylist)
# 3.x 返回的是对象 filter object
print(list(resultOne))
# 3.x 须做类型转换 [0, 2, 8, 34]
结果为,成功将list中的奇数筛去。同时,我们也可以用学过的lambda函数实现相同的功能。哈哈,来再次见证lambda对于简单函数的短小精悍。
代码块2:
mylist =[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
resultTwo= filter(lambda x:x%2 == 0,mylist)
print(list(resultTwo))
#结果为[0, 2, 8, 34]
通过代码块2这个例子我们已经认识了filter函数,同时我们也要明白True 或者False也可以通过判断function的结果来产生呦。
代码块3:(鱼香肉丝)
Jieba是一个中文分词模块。我们用jieba的全模式,分割“鱼香肉丝有没有鱼呢?”这句话,中国人都知道老婆饼里没有老婆,鱼香肉丝里面也没有鱼,那我们就用filter函数实事求是地,正大光明地将切割结果中“鱼”筛去。
# -*- coding: utf-8 -*-
import jieba
resultThree= jieba.cut('鱼香肉丝里有没有鱼呢',cut_all = True)
# cut_all = True全模式,得到一个迭代器
print (','.join(jieba.cut('鱼香肉丝里有没有鱼呢',cut_all = True)))
# 结果为: 鱼香肉丝,香肉,肉丝,里,有没有,没有,鱼,呢
list(filter(lambda x:x!='鱼',box2))
#结果为: ['鱼香肉丝', '香肉', '肉丝', '里', '有没有', '没有', '呢']
嘿嘿,成功拿走了鱼。
filter函数深度说明:
filter只能接受两个参数(function,sequence) ,其中函数function中只能返回一个值。
3.x 返回的是一个filter object (迭代器) (同函数map),要加上list()等类型转换;而2.x 版本的返回值类型和参数sequence的类型相同。
思考:为什么说filter和 map “同工异曲”呢?
太好啦,在代码中我们复习了lambda匿名函数,现在让我们趁机复习一下棒棒的map(function or None, sequence)。
“同工”是从他们作用的方式,两个函数都对指定序列的每个元素进行操作,过程为将序列的每个元素作用在指定的function。
“异曲”呢,是因为他们的返回结果不同: filter最后返回的结果包含调用结果为True的元素;map返回的结果为元素调用function函数的返回值。再次提醒,Python3返回对应结果的迭代器,打印须做类型转换。
结束语:
Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读。非常重要的lambda、map和filter,都已经介绍啦,你get到了吗?在留言区或者打卡群提问呦。在作者之后的文章中会讲述python的一些有趣的好玩的模快以及面试题,敬请期待。
最后祝大家端午节快乐啦~~
端 午 安 康
欢迎热爱数据挖掘的你加入我们的编辑团队,有兴趣后台私聊小编哦,坐等调戏~~~
长按识别二维码关注我们








