从零开始学Python-Day27-filter

Python零基础 木人张 3年前 (2020-03-30) 882次浏览 0个评论 扫描二维码
文章目录[隐藏]

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()结果的时候,才会真正筛选并每次返回下一个筛出的元素。


木人张,版权所有丨如未注明 , 均为原创,禁止转载。
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址