文章目录[隐藏]
filter用于筛选过滤序列,属于Python内建函数。
filter也是接收传入一个函数和一个序列,将函数依次作用于序列的每一个元素,根据返回值的True、False判断决定元素的去留。例如,我们要去除一个序列中的奇数,只保留偶数:
>>> def jishu(x): return x % 2 != 0 >>> list(filter(jishu,[1,2,3,4,5,6,7,8,9,10])) [1, 3, 5, 7, 9]
可以筛选剔除一个序列中的空字符:
>>> def noempty(x): return x and x.strip() >>> list(filter(noempty,['A','','B',None,'C',' '])) ['A', 'B', 'C']
filer函数返回的是一个Iterable,属于惰性序列,所以要使用list使其完成计算,获得结果list
利用filter求取质数
先了解下质数的概念:除了1和该数自身外,无法被其他自然数整除的数。
那我们要制作一个质数列表,这里使用埃拉托色尼筛选法,简称埃氏筛选法:
针对一个自然数数列:
(1)先把1删除(现今数学界1既不是质数也不是合数)
(2)读取队列中当前最小的数2,然后把2的倍数删去
(3)读取队列中当前最小的数3,然后把3的倍数删去
(4)读取队列中当前最小的数5,然后把5的倍数删去
(5)读取队列中当前最小的数7,然后把7的倍数删去
(6)如上所述直到需求的范围内所有的数均删除或读取
不断筛选下去就可以得到所有质数。
先构造一个从3开始的奇数序列,这个生成器是个无线序列:
>>> def odd(): n = 1 while True: n = n + 2 yield n
然后定义筛选函数:
def notdivisible(n): return lambda x: x % n > 0
最后,定义一个生成器,不断返回下一个质数,这里用到filter来筛选:
>>> def primes(): yield 2 it = odd() while True: n = next(it) yield n it = filter(notdivisible(n),it)
由于primes是个无限数列,输出时我们要加上限制条件:
>>> for n in primes(): if n < 100: print(n) else: break 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
filter的作用是从一个序列中筛出符合条件的元素。由于使用的是惰性计算,所以只有在取filter()结果的时候,才会真正筛选并每次返回下一个筛出的元素。