先說說思路:函數
素數是一個無限循環,這一點跟生成器的特性很像,因此咱們用生成器所謂這個素數序列的主要部分。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)