關於這個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    以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()結果的時候,才會真正篩選 並每次返回下一個篩選出的元素
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM