1. 程式人生 > >關於這個filter函式的解析

關於這個filter函式的解析

程式碼來源: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()
結果的時候,才會真正篩選 並每次返回下一個篩選出的元素