初学者python笔记(filter函数究竟是什么?)

在Python中总有些奇奇怪怪的函数,filter就是一个,但是它特别强大和实用,了解它本质才能更好得使用它。本篇文章会从最基础的函数嵌套开始分析,都是 filter 函数执行的原理,到最后就知道 filter 函数的妙处了
这里还要用到两个库函数:
startswith():判断某字符串是否以参数中的字符串开头
endswith() :判断某字符串是否以参数中的字符串结尾
二者的返回值都是布尔值:True或False

初级版本——普通函数:

movie_people = ['sb绿巨人','美国队长', 'sb钢铁侠', '蜘蛛侠sb']
def filter_test(array):  #接收列表的形参array
    ret = []
    for i in array:
        if not i.startswith('sb'):  #判断是否以'sb'开头,如果不是sb开头,返回值为False,有一个not,则可以执行追加语句
            ret.append(i)   #追加到ret列表中
    return ret  #python中可以返回列表
print(filter_test(movie_people))  #返回值是ret列表,所以这里也是输出ret列表

结果是:
[‘美国队长’, ‘蜘蛛侠sb’]
因为只有这两个不是以sb开头的

改进版本——函数嵌套:

movie_people = ['sb绿巨人','美国队长', 'sb钢铁侠', '蜘蛛侠sb']
def sb_till(n):
    return n.endswith('sb')  #判断是否以'sb'结尾,若是,则返回True

def filter_test(func,array):
    ret = []
    for i in array:
        if not func(i):  #如果是以sb结尾,返回的布尔值为False,则添加到ret列表中
            ret.append(i)
    return ret  #python中可以返回列表
res = filter_test(sb_till,movie_people)
#这里filter_test函数传入的形参是sb_till函数和movie_people列表
print(res)

结果是:
[‘sb绿巨人’, ‘美国队长’, ‘sb钢铁侠’]
这几个显然都不是以sb结尾的字符串

高级版本——匿名函数:

movie_people = ['sb绿巨人','美国队长', 'sb钢铁侠', '蜘蛛侠sb']
def filter_test(func,array):
    ret = []
    for i in array:
        if not func(i):
            ret.append(i)
    return ret
res = filter_test(lambda n:n.endswith('sb'),movie_people)
#如果n是以sb结尾的话,返回值是True,前面加一个not,则不会保留下来,也不会输出
print(res)

结果是:
[‘sb绿巨人’, ‘美国队长’, ‘sb钢铁侠’]
这里用到了匿名函数的调用,lambda,这样定义的函数可以直接用,冒号前面的n是需要处理的对象,冒号后的n是对n的处理。

终极版本——filter函数:

上面三个版本,实现的功能差不多都是一样的,每个版本都是那么多行的代码,而且逻辑还不简单,如果理解了也可以更好记住 filter 函数。
下面,就是 filter 函数上场了表演了,只需要短短两行就可以实现上面十几行代码所能实现的功能。

movie_people = ['sb绿巨人','美国队长', 'sb钢铁侠', '蜘蛛侠sb']
res = list(filter(lambda n:not n.endswith('sb'),movie_people))
print(res)

Ps:
#遍历第二个参数里面的元素,如果第一个参数是True就保留该元素,
#filter返回的是元素的内存地址,若要输出出该元素,
#需要将返回值list列表化一下,或者tuple元组化

发布了17 篇原创文章 · 获赞 32 · 访问量 1993

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/104564960