题目描
用filter求素数
题目来源及自己的思路
廖雪峰网站的一个例子,小白问下 n = next(it) 这行,it的初始值应该是3,赋值给n也是3,在下面的过滤器不把it里面的3过滤掉了吗?
还有 n = next(it) 这行怎么返回第一个数的。
相关代码
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) # 构造新序列
打印1000以内的素数:
for n in primes():
if n < 1000:
print(n)
else:
break
_odd_iter()
返回一个奇数生成器(generator)这个应该没啥问题,因为非2的偶数不可能为素数。核心代码primes()
实际上用的是埃拉托斯特尼筛法,filter
就是排除能被前面的素数整除的数,剩下的就是素数了。这个实际上会嵌套很多层,初始
it
中只返回奇数,第二层it
将在奇数外面再加了一层过滤,即不能被 3 整除,第三层在第二层基础上又加了一层过滤,不能被 5 整除。。。。。