關於這個filter函式的解析
阿新 • • 發佈:2018-11-22
程式碼來源: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
3.在_not_divisiable(n)中 n為惰性序列舊產生的素數,x為惰性序列新產生的奇數
4.filter()
使用了惰性計算,所以只有在取filter()
結果的時候,才會真正篩選 並每次返回下一個篩選出的元素