当前位置:   article > 正文

Python内置函数filter用法小结

Python内置函数filter用法小结

filter被称为高阶函数是有道理的。

filter(self, /, *args, **kwargs)

Docstring:      filter(function or None, iterable) --> filter object  

Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.

 从Doc的简单描述可以看出,filter的主要作用是通过function对iterable中的元素进行过滤,并返回一个迭代器(iterator),其中是function返回True的元素。如果function传入None,则返回所有本身可以判断为True的元素。

例1:

  1. l = [x for x in range(10)]
  2. print(list(filter(lambda x : x%2 == 0, l)))
  3. #输出[2,4,6,8]

因为filter返回的是一个iterator,所以输出的时候需要用list进行转换。

例2:

  1. l = [x for x in range(0, 10)]
  2. print(list(filter(None, l)))
  3. #输出[1,2,3,4,5,6,7,8,9]

和例1的输入略有区别,输入是0~9,filter的第一个参数传入了None,所以在迭代过程中,0被判断为False从而被过滤,1~9被保留下来。这个方法可以替代for循环的数据拾取。

通过上面的例子可以看出,调用filter时并没有触发过滤过程,因为调用filter函数只是返回了一个iterator,它是惰性计算,只有next或者list的时候,才真正开始计算过程。

上面是两个基本的用法,接下来看filter的更高级一点儿的用法。

  1. def _odd_iter():
  2. n = 1
  3. while True:
  4. n = n + 2
  5. yield n
  6. def _not_divisible(n):
  7. return lambda x : x%n>0
  8. def primes():
  9. yield 2
  10. it = _odd_iter()
  11. ftr = filter(_not_divisible(2), it) #1
  12. while True:
  13. n = next(ftr ) #2
  14. yield n
  15. ftr = filter(_not_divisible(n), ftr ) #3
  16. for n in primes():
  17. if n < 100:
  18. print('now:',n)
  19. else:
  20. break

例子摘自廖雪峰的教程,其中对#1,#2,#3三行做了修改。

通过这个例子,可以看到filter的两个高级用法:

1.其实filter返回的是一个filter对象。#3行通过重复赋值,可以向filter中添加多个过滤器。例子中,就是通过每次执行#3行,把当前素数作为新的被除数条件加入到过滤器ftr 中,所以在for循环的后续迭代中,每次都增加一个素数条件进入过滤器。

通过这种重复赋值的方法,可以给filter添加多个过滤函数,极大的加强了过滤功能。

2. filter的第二个参数可以传入iterator。当然,此时就不能用list取filter的结果,只能用next(filter对象)取下一个过滤结果为True的元素。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/578430
推荐阅读
相关标签
  

闽ICP备14008679号