廖雪峰Python教程中“用filter求素数”的思考与总结

埃氏筛选法求素数:

链接: 原文.
在这里插入图片描述

用Python来实现这个算法,可以先构造一个从3开始的奇数序列:

// An highlighted block
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

这里首先,默认了2是第一个素数,并且已经把而的倍数排除掉,所以剩下的都是从3开始往后的奇数。所以创建了一个从3开始的奇数序列。

// An highlighted block
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(n), it) # 构造新序列

这个生成器先返回第一个素数2,然后,利用filter()不断产生筛选后的新的序列。这里要注意的就是it的初始化和赋值,始终都是没有在系统中一次把全部的数列元素生成的,应为它是Iterator对象,是惰性计算的。每调用一次next(it)就计算一次下一个符合条件的素数。而这里就是通过filter()的筛选函数功能当前n值得倍数剔除掉。
你可以这样子理解,当对生成奇数5的时候,系程序会对5%2>0进行判断筛选,在对5%3>0进行判断筛选,然后通过筛选,输出5为下一个素数。

it = filter(_not_divisible(n), it) # 构造新序列

这上面的语句,在执行时,可以理解为,每生成一个数列值都进行了一系列的嵌套的条件判断进行筛选。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值