Python 埃氏筛法

本文通过Python代码展示了如何使用埃氏筛法找到素数。代码中使用filter函数构建了一个奇数序列,排除偶数,并通过迭代生成器不断筛选出素数。最终,代码会在遇到大于20的素数时停止打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
# filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。


# 构造一个奇数序列,排除了所有偶数,因为除了2之外的偶数都是非素数
def _odd_iter():
   a = 1
   while True:
      a = a + 2
      yield a  # 首次调用返回3
      print('a=', a)


def _not_disvisiable(b):
   return lambda x: x % b > 0


def primes():
   yield 2  # 返回首个素数2
   it = _odd_iter()  # 初始化序列

   while True:
      c = next(it)  # 通过_odd_iter函数不停获取返回的值
      # filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。
      it = filter(lambda y, z=c: y % z > 0, it)  # 构造新序列
      # it = filter(_not_disvisiable(c), it)
      yield c
"""
一直没搞清楚这里面的运行机制,后面利用单步调试后终于理清,首先从For循环进入到primes(),
获得首个返回值2,此时打印出n=2,随后继续For循环进入到it=_odd_iter(),_odd_iter为生成器。
随后进入while循环,首个c = next(it)未获取到值,进入到_odd_iter()函数,初始化a,
进入_odd_iter函数的while循环,返回a=3,y等于返回值3与it序列的参数进行取余验证是否整除,整除则移除
此时it序列无值,3不能被整除,next(it)为3,故而yield c,打印出n=3,进入For循环,进入到c = next(it)
进入_odd_iter函数,此时打印出a=3,进入到下一步while循环a=3+2,yield a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值