# 1.队列生成器
def _odd_iter():
n = 1
while True:
n = n + 2 # 偶数一定不是素数
yield n
# 2.筛选器
def _not_divisible(nn):
return lambda x: print('x:', x, 'nn:', nn, 'id(x)', id(x)) or x % nn > 0
# 3.生成器,返回下一个素数
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 < 100:
print("---------------", n, "-------------------")
else:
break
有几个问题
1.我现在知道 filter(_not_divisible(n), it),这行代码是在 next(it)的时候才会真正执行,filter 过滤函数的 x 是当前 it 的值,但是 nn 为什么每次执行 filter 函数的时候 nn 一直从 3 开始递增
2.filter 不是对序列中每一个值进行过滤函数的处理吗,那么 it 是一个惰性序列,x % nn > 0 这个退出的边界是什么啊,打印的日志 nn 递增到最后都是比 x 小,然后就退出这一次的 filter 了
--------------- 2 -------------------
--------------- 3 -------------------
x: 5 nn: 3 id(x) 140728014001312
--------------- 5 -------------------
x: 7 nn: 3 id(x) 140728014001376
x: 7 nn: 5 id(x) 140728014001376
--------------- 7 -------------------
x: 9 nn: 3 id(x) 140728014001440
x: 11 nn: 3 id(x) 140728014001504
x: 11 nn: 5 id(x) 140728014001504
x: 11 nn: 7 id(x) 140728014001504
--------------- 11 -------------------
x: 13 nn: 3 id(x) 140728014001568
x: 13 nn: 5 id(x) 140728014001568
x: 13 nn: 7 id(x) 140728014001568
x: 13 nn: 11 id(x) 140728014001568
--------------- 13 -------------------
x: 15 nn: 3 id(x) 140728014001632
x: 17 nn: 3 id(x) 140728014001696
x: 17 nn: 5 id(x) 140728014001696
x: 17 nn: 7 id(x) 140728014001696
x: 17 nn: 11 id(x) 140728014001696
x: 17 nn: 13 id(x) 140728014001696
--------------- 17 -------------------
x: 19 nn: 3 id(x) 140728014001760
x: 19 nn: 5 id(x) 140728014001760
x: 19 nn: 7 id(x) 140728014001760
x: 19 nn: 11 id(x) 140728014001760
x: 19 nn: 13 id(x) 140728014001760
x: 19 nn: 17 id(x) 140728014001760
大神们求解啊 或者给一个方向
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.