代碼來源:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431821084171d2e0f22e7cc24305ae03aa0214d0ef29000
#filter()函數的作用:filter()
把傳入的函數依次作用於每個元素,然后根據返回值是True
還是False
決定保留還是丟棄該元素
#filter()
函數返回的是一個Iterator
,也就是一個惰性序列,所以要強迫filter()
完成計算結果,需要用list()
函數獲得所有結果並返回list。
def _odd_iter():
#構造從3開始的奇數序列
n=1
while True:
n+=2
yield n #這是生成器,並且是無限序列
#定義一個篩選函數
def _not_divisible(n):
return lambda x:x%n>0 #n為惰性序列舊產生的素數,x為惰性序列新產生的奇數
#定義一個生成器,不斷返回下一個素數
#這個生成器會返回第一個素數2,then,利用filter()不斷產生篩選后的新序列(保證這個奇數是素數)
def primes():
yield 2
it=_odd_iter() #初始序列
while True:
n=next(it)
yield n
it=filter(_not_divisible(n),it) #構造新序列 重點
#打印100以內的素數
for n in primes():
if n<100:
print(n)
else:
break
注意點:
1.每次yield之后都會產生新的it(generator,惰性序列,)
2.程序最大的問題可能在我標‘重點’那兒
2.1 以n=11來舉例說明 @
2.2 當n=11時,進入_not_divisible(n)
2.3 執行 lambda x:x%n>0 (2.4 2.5 2.6 2.7 為關於filter()函數的運行過程)
2.4 沒有x,接下來就通過it(_odd_iter())產生新的奇數(不確定到底是不是素數)
2.5 而后通過n=next(it)產生舊的素數n #(跟'@行'的n不一樣)
2.6 並通過lambda x:x%n>0來判斷產生的奇數是不是素數
2.7 會利用n=next(it)不斷地返回it中舊的素數,然后利用filter()中傳入的函數依次作用於舊的素數
2.8 將過濾好的素數賦給it
2.9 然后利用n=next(it)
2.10 通過yield n輸出新產生的素數
3.在_not_divisiable(n)中 n為惰性序列舊產生的素數,x為惰性序列新產生的奇數
4.filter()
使用了惰性計算,所以只有在取filter()
結果的時候,才會真正篩選 並每次返回下一個篩選出的元素