python中使用filter生成全部素数算法及讲解

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

def zc(x):
     return  x%n > 0

def _not_divisible(n):
    return lambda x: x % n > 0

def primes():
    yield 2
    it = _odd_iter() # 将地址赋予it
    while True:
        n = next(it) # 返回序列的第一个数3
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列
#对上面解释:
# 第一次返回2
#  第二次执行时,第一次执行到yield n 这时候n=3,返回3
#第三次执行时,执行到了it = filter(_not_divisible(n), it),
# 此时n=3,也就是it2 = filter(lambda x:x%3 > 0,it) lambda x:x%3>0是函数,括号中的it是惰性序列,(这里为了区分使用it2标记)
# 然后由函数与it构造一个filter返回一个新的惰性序列,赋值给it2
# 此时的it2=filter(lambda x:x%3 > 0,iterator(3,5,7,9....))即it2收集到的是一个不能被2,3整除的惰性序列即iterator(5,7,11...)
#然后继续执行,while True: n=next(it2) 然后将n的值返回,这里是将此时n的值为5,因为it2过滤掉了3,3%3=0,然后将5返回
#第四次执行,it3 = filter(lambda x:x%5 > 0,iterator(5,7,11...))此时it3收集到的是不能被2,3,5整除的惰性序列了
#以此类推,就收集到了全部的素数啦

猜你喜欢

转载自blog.csdn.net/qq_37113604/article/details/84579324