"""为了描述清楚,我给每个it都起个别名"""
1 def _odd_iter():
2 n = 1
3 while True:
4 n = n + 2
5 yield n
6 def _not_divisible(n):
7 print("n = ", n)
8 return lambda x: x % n > 0 # 把是n的倍数的数字除去
9 def primes():
10 yield 2
11 it3 = _odd_iter() # [3,5,7,9,...]
12 while True:
13 n = next(it2)
14 yield n
15 # filter第二个参数是可迭代对象就可以
16 it4 = filter(_not_divisible(n), it3)
"""
_not_divisible函数中的x参数,是由it3生成的,
当程序第一次执行到16行时,it4是一个包含除去it3生成的数字中3的倍数的数字,如果it3是一个
列表,it4中的值可以直接next出来,不需要由it3生成x参数。但此时it3是一个生成器,也就是说
我们在取x的值的时候,程序要运行_odd_iter来生成x。
执行完16行后,开始取filter过滤后的数字了,next去取的时候,先计算x的值,这次运行后x=5,
然后运行filter中的过滤条件,也就是_not_divisible函数体中的语句,如果满足条件,说明第13
行中的n取到值了,此时,可以yield这个素数了。
然后第二次执行第16行,此时it4是一个包含除去it3中5的倍数和3的倍数的数字,(我写"包含除了3
和5倍数的数字"是因为,这个时候的it3是包含不是3的倍数的值。这是第一次运行16行得结果,只
是因为生成器是惰性的,所以我们只能在逻辑上先这样想。而第二次运行时,it4是包含除了5的倍数
的数值。下面会解释什么时候运行除以3。)
然后运行第13行,
开始取filter过滤后的数字了,next去取的时候,先计算x的值,这次运行后x=7,
然后运行filter中的过滤条件,拿7依次去除以3和5,如果满足条件,第13行中会取到n的值了,此
时,可以yield这个素数了。依次类推。
"""
17 for n in primes():
18 if n <= 20:
19 print(n)
20 else:
21 break
嗯,如有不对还请各位大佬指正~不胜感激!