求素数

def _odd_iter():
n = 1
while True:
n = n + 2
yield n

def _not_divisible(n):
def aa(x):
# pass
return x % n > 0
return aa
# 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) # 构造新序列



for n in primes():
if n < 1000:
print(n)
else:
break
解说:
n = next(it) # it不断的 +2 然后判断return  x % n > 0 是否是真,如果为真则保留,如果为假就再执行一次 next(it) 也就是it再 +2然后再判断return  x % n > 0 是否是真,所以不断的返回序列下一个素数;


yield n    #不断的返回素数,

it = filter(_not_divisible(n), it) # 构造新序列

 

其中 filter(_not_divisible(n), it)

中it 是定义的一个 开始是1 不断加2 的一个迭代器;
n = next(it) 后n = 3 yield 返回 3

it = filter(_not_divisible(n), it) 返回一个 aa 的函数 和 一个迭代器 it

然后 n = next (it) 的时候才开始调用 aa 的函数 和 迭代器 it
这个时候 it = 5 n = 3 return x % n > 0 为真保留 5

下一次 it = 7 n = 3 和 n = 5 return x % n > 0 为真保留 7

it 对应 aa 函数中的x

n 对应 aa 函数中的n 
n 等于 构造新序列素数的 it 列表,也就是不断的next (it) 获取新的 值追加到n 的列表中,因为filter()函数返回的是一个Iterator,也就是一个惰性序列,所以需要不断的next获取他的值;

然后就是不断的循环 it + 2 然后除以 之前的 it 的列表(也就是n)的值

-----------------------类似于下面的代码------------------------------------

def is_odd(n):
return n % 2 == 1

n = (filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
print(n)
print (next (n))
print (next (n))
print (next (n))
print (next (n))
-------------------------------------------------------

代码参考:

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431821084171d2e0f22e7cc24305ae03aa0214d0ef29000

 




posted @ 2018-07-27 17:16  只记今朝笑  阅读(134)  评论(0编辑  收藏  举报