# -*- 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
Python 埃氏筛法
最新推荐文章于 2026-04-24 21:00:14 发布
本文通过Python代码展示了如何使用埃氏筛法找到素数。代码中使用filter函数构建了一个奇数序列,排除偶数,并通过迭代生成器不断筛选出素数。最终,代码会在遇到大于20的素数时停止打印。


740

被折叠的 条评论
为什么被折叠?



