素數(shù)原理:
1坦喘、列出從2開始的所有自然數(shù)原押,構(gòu)造出一個序列(迭代器生成)
2,3,4,5,6,7,8,9,......
2由蘑、取出序列的第一個數(shù)2,它一定是素數(shù)啊楚,然后用2把序列中2的倍數(shù)篩掉
3,4,5,6,7,8,9,...
3、取新的序列第一個數(shù)3,然后把序列中3的倍數(shù)篩掉
5,6,7,8,9,10,11,12,...
4电谣、取新序列的第一個數(shù)5,然后用5把序列的5倍數(shù)篩掉
6,7,8,9,10,11,12,13,14,15,...
使用Python來實現(xiàn)這個算法
#定義獲取所有奇數(shù)的迭代器
def _odd_iter():
m = 1
while True:
m = m + 2
yield m
#定義匿名篩選函數(shù)
def _not_divisible(y):
#該匿名函數(shù)f(x)功能是數(shù)x如果不被y取整(整除)秽梅,返回true,否則返回false
return lambda x:x % y > 0
#定義一個素數(shù)生成器,每迭代一次返回一個素數(shù)
def primes():
yield 2 #返回第一個素數(shù)2
it = _old_iter() #初始化奇數(shù)序列,該序列元素類似(3,5,7,9,11,....)
while True:
y = next(it) #獲取序列第一個元素
yield y #返回系列第一個元素
it = filter(_not_divisible(y), it) #參考下面運行流程
for k in primes():
if k < 50:
print(k)
else:
break
運行流程如下:
primes是一個迭代器辰企,每一次循環(huán)只獲取一個數(shù)據(jù)(yield返回值)
初始迭代器 it = _old_iter() #it:3,5,7,9,11,...
1风纠、第一輪執(zhí)行
y = next(it) #獲取的第一個元素為3
yield y #返回數(shù)字3
2、第二輪執(zhí)行
#第一輪 y=3
#新的迭代器it變更為下面這個fliter迭代器, 舊的it當(dāng)執(zhí)行next之后3被取出,剩下的就是(5,7,9,11,...)
#f(x%3)即上面的那個匿名函數(shù),不被3整除的數(shù)字x
it1 = filter(f(x%3), it)
= filter(f(x%3), (5,7,9,11,...))
#執(zhí)行獲取下一個元素,從迭代器it1中獲取牢贸。
#流程:
a)取迭代器it第一個數(shù)字,得到5
b)執(zhí)行filter中的匿名函數(shù)f(x%3)=f(5%3)=2為True竹观,返回該數(shù)5
y = next(it1) = 5
yield y #返回數(shù)字5
3、第三輪執(zhí)行
# 第二輪 y = 5
# 新的迭代器it變更為下面的filter迭代器
#f(x%5)即上面的那個匿名函數(shù),不被5整除的數(shù)字x
#注意,最原始的it迭代器已經(jīng)把3,5給獲取了,剩下的就是it=(7,9,11,13,15,...)
it2 = filter(f(x%5), it1)
= fliter(f(x%5), filter(f(x%3), it)
= fliter(f(x%5), filter(f(x%3), (7,9,11,13,15,...))
#執(zhí)行獲取下一個元素,從迭代器it2中獲取潜索。
#流程:
a)取迭代器it第一個數(shù)字,得到7
b)執(zhí)行內(nèi)存fliter中的匿名函數(shù)f(x%3)=f(7%3)=1=True,返回數(shù)字7
c)繼續(xù)執(zhí)行外層fliter中的匿名函數(shù)f(x%5)=f(7%5)=2=True,返回數(shù)字7
y = next(it2)=7
yield y #返回結(jié)果7
4臭增、第四輪執(zhí)行
#第三輪 y=7
#新的迭代器it變更為下面的filter迭代器
#f(x%7)即上面的那個匿名函數(shù),不被7整除的數(shù)字x
#原始迭代器it=(9,11,13,15,...)
it3 = filter(f(x%7), it2)
= fliter(f(x%7), filter(f(x%5), it1))
= filter(f(x%7), filter(f(x%5), filter(f(x%3), it)
= filter(f(x%7), filter(f(x%5), filter(f(x%3), (9,11,13,15,...)))
#執(zhí)行獲取下一個元素,從迭代器it3中獲取。
#流程:
a)取迭代器it第一個數(shù)字,得到9
b)執(zhí)行最內(nèi)層filter篩選器中函數(shù)f(x%3)=f(9%3)=0=False, 9不符合要求被丟棄,迭代器it變?yōu)?11,13,15,...)
c)繼續(xù)獲取迭代器it的第一個元素11
d)執(zhí)行最內(nèi)層filter篩選器中函數(shù)f(x%3)=f(11%3)=2=True,返回結(jié)果11到第二層filter
e)執(zhí)行第二層filter篩選器函數(shù)f(x%5)=f(11%5)=1=True,返回結(jié)果11到第三層(最外層)fliter
f)執(zhí)行第三層filter篩選器函數(shù)f(x%7)=f(11%7)=4=True,返回結(jié)果11給y
y = next(it3)=11
yield y #返回結(jié)果11
5竹习、第五輪執(zhí)行
#第四輪 y=11
#新的迭代器
it4 = filter(f(x%11), it3)
= filter(f(x%11), filter(f(x%7), it2))
= filter(f(x%11), filter(f(x%7), filter(f(x%5), it1)))
= filter(f(x%11), filter(f(x%7), filter(f(x%5), filter(f(x%3), it)))
= filter(f(x%11), filter(f(x%7), filter(f(x%5), filter(f(x%3), (13,15,17,19,....))))
....參照第四輪執(zhí)行過程