filter()
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
>>> def odd(n):
return n % 2 == 1
>>> list(filter(odd,[1,3,5,6,7,8,14,27]))
[1, 3, 5, 7, 27]
还可以把一个字符串中的空字符删掉:
>>> def empty(s):
return s and s.strip()
>>> list(filter(empty,['a','','c',None,' ']))
['a', 'c']
可见用 filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
注意到 filter()函数返回的是一个 Iterator,也就是一个惰性序列,所
以要强迫 filter()完成计算结果,需要用 list()函数获得所有结果并返
回 list。
用 filter 求素数:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
注意这是一个生成器,并且是一个无限序列。
然后定义一个筛选函数:
def _not_divisible(n):
return lambda x: x % n > 0
最后,定义一个生成器,不断返回下一个素数:
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
由于 primes()也是一个无限序列,所以调用时需要设置一个退出循环。