用生成器实现素数序列

先说说思路:函数

素数是一个无限循环,这一点跟生成器的特性很像,因此咱们用生成器所谓这个素数序列的主要部分。spa

第二步就是要筛选了,首先从天然数序列中,从2开始的天然数序列,用一个生成器表示比较合适。code

从以第个元素开始2,确定是素数,收入到素数集合里,取下一个元素,因为前一个元素的全部倍数都被筛选掉了,因此新序列的第一个元素必定是素数“除了本身以外,没有约数”blog

循环不止,筛选不止。获得是这个无限循环列表就是素数序列ip

筛选的过程咱们想起来内建函数filter(),特性很像mapreduce,能够用来所列表筛选。element

因而第一步,咱们先用生成器组建从2开始的天然数序列,代码以下:class

1 def OddList():
2     n = 1
3     while True:
4         n += 1
5         yield 

第二步:咱们要设置筛选函数,对于一个新的序列,咱们要拿到第一个元素,而后对整个序列作一次迭代,删掉第一个元素的倍数,该特性与filter()同样,lambda

1 def MultiFilter(multipleNum):
2     return lambda element: element % multipleNum > 0 
说明:因为multifilter是被filter()包含的,因此multerfilter中有一个参数是序列的元素,必定会传进来的,可是因为没法表示2个参数,因此考虑用匿名




第三步:
限迭代奇数生成器,在每个迭代中,生成一个新的序列(生成器),生成新序列的过程又是一个迭代过程,在这个过程当中把元素n的倍数过滤掉
 
1 def PrimeList(maxNum):
2     mainList = OddList()              #主要为了生成2
3     firstElement = next(OddList())    #curentElement 标签始终指向当前元素,做为倍数参与筛选
4     yield firstElement
5     while firstElement < maxNum:
6         mainList = filter(MultiFilter(firstElement), mainList)     ##mainList 标签始终指向主生成器,用生成器OddList()初始化
7         firstElement = next(mainList)             #每次只取新序列的一个元素
8         yield firstElement

 

其实咱们发现,是不断筛选mainList这个生成器,新序列的第一个元素必定是素数,咱们作二次生成,再以生成器的形式存储。剩下的就是迭代新的素数生成器了List

1 if __name__ == '__main__':
2     for x in PrimeList(1000):
3         print(x)
相关文章
相关标签/搜索