注:
这个问题与
using filter and generator to generator endless prime number in python
尽管这两种方法都与Python代码有关,但它们查找的所有素数都达到了给定的限制。
核心代码实际上非常简单,但我很难理解它是如何工作的。这就是我添加一些调试打印的原因。
def _odd_number_generator():
x = 1
while True:
x += 2
print(' _odd_number_generator, x=', x)
yield x
def _not_divisible(n):
def func(x):
print(" filter calling on x:", x, ", n:", n)
return x % n > 0
return func
def _primes():
yield 2 # return first prime: 2
odd_numbers = _odd_number_generator()
print(" in _primes, #a: odd_numbers=", odd_numbers)
while True:
print(" in _primes, #b: before next(filter) odd_numbers=", odd_numbers)
# I know this line calling _odd_number_generator and _not_divisible,
# but how it works
n = next(odd_numbers)
print(" in _primes, #c: begin yield n:", n)
yield n
print(" in _primes, #d: n=", n, ", after yield odd_numbers=", odd_numbers)
odd_numbers = filter(_not_divisible(n), odd_numbers)
print(" in _primes, #e: n=", n, ", after filter odd_numbers=", odd_numbers)
def print_prime_numbes():
for n in _primes():
print(" in print_prime_numbes, n = ", n)
if n < 30:
print(n)
print()
print("print_prime_numbes, begin next loop: n=", n)
else:
break
def test_print_prime_numbes():
print("test_output_triangles() >>>")
print_prime_numbes()
答案在
用滤波器和生成器在python中生成无穷素数
对于理解链式迭代器非常有帮助。但是,我还是很难理解奇数发生器和
_当处理数字25时,不可除被调用。
例如,以下是运行时的一个输出:
print_prime_numbes, begin next loop: n= 23
in _primes, #d: n= 23 , after yield odd_numbers= <filter object at 0x000002B0E02366D8>
in _primes, #e: n= 23 , after filter odd_numbers= <filter object at 0x000002B0E0236F98>
in _primes, #b: before next(filter) odd_numbers= <filter object at 0x000002B0E0236F98>
_odd_number_generator, x= 25
filter calling on x: 25 , n: 3
filter calling on x: 25 , n: 5
_odd_number_generator, x= 27
filter calling on x: 27 , n: 3
_odd_number_generator, x= 29
filter calling on x: 29 , n: 3
filter calling on x: 29 , n: 5
filter calling on x: 29 , n: 7
filter calling on x: 29 , n: 11
filter calling on x: 29 , n: 13
filter calling on x: 29 , n: 17
filter calling on x: 29 , n: 19
filter calling on x: 29 , n: 23
in _primes, #c: begin yield n: 29
in print_prime_numbes, n = 29
29
在这里,因为25是可除的,所以生成下一个数字27。我想知道是什么让电话产生了27?
[编辑]
在生成23之后,进入下一个循环,奇数应该是这样的:
filter(_not划分(23),filter(_not划分(19)…filter(_not划分(7),filter(_not划分(5),filter(_not划分(5),filter(_not划分(3),_odd_generator())。
当运行“yield n”时,将生成下一个数字25并检查可除性,并且_not divisible返回false。这里,看起来“yield”将在奇数生成器()上运行,并检查新数字是否可以除以3、4、5、.23,直到得到素数。但我想详细了解这里的机制。