用filter求素数时遇到的疑问

用filter求素数:

图片说明
图片说明

看廖老板的python教程里面
一直搞不懂上面这个程序,按照我自己的理解当程序运行到 it = filter(_not_divisible(n), it) 的时候难道 程序在调用函数_not_divisible(n) 里面的return lambda x: x % n > 0 难道不会一直运行吗? 一直无限的计算下去吗?后面我自己在这个代码后面加了个打印 会出现内存错误 ,这不正是引证了这个计算会无限的一直算出不能被n整除的数吗? 求大神给我解答下?谢谢

你修改了题目?
根据你题目的算法,用筛选法也可以

 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, it)

for n in primes():
    if n < 100:
        print(n)
    else:
        break;

之所以不会无限执行,是因为这是生成器,所以for n in primes():这个循环其实是

 it = primes()
while True:
    x = next(it)
    print(x)
    if (x > 100): break

而每次调用next,

def primes()中的代码会走到下一次yield就暂停了。

from itertools import *

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

def divisible(n):
    return lambda x: x % n == 0

def primes():
    yield 2
    for x in _odd_iter():
        for y in range(3, x + 3):
            if x == y:
                yield x
            if divisible(y)(x):
                break;


for n in takewhile(lambda x: x < 100, primes()):
    if n < 100:
        print(n)
    else:
        break;

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

Process finished with exit code 0