filter()函數(shù)用于過濾序列。 和map()類似,filter()也接收一個函數(shù)和一個序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。 例如,在一個list中,刪掉偶數(shù),只保留奇數(shù),可以這么寫: def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 結果: [1, 5, 9, 15] -------------------------------------------------------------- 把一個序列中的空字符串刪掉,可以這么寫: def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 結果: ['A', 'B', 'C'] -------------------------------------------------------------- 不斷篩下去,就可以得到所有的素數(shù)。 用Python來實現(xiàn)這個算法,可以先構造一個從3開始的奇數(shù)序列: def _odd_iter(): n = 1 while True: n = n + 2 yield n 注意這是一個生成器,并且是一個無限序列。 然后定義一個篩選函數(shù): def _not_divisible(n): return lambda x: x % n > 0 最后,定義一個生成器,不斷返回下一個素數(shù): def primes(): yield 2 it = _odd_iter() # 初始序列 while True: n = next(it) # 返回序列的第一個數(shù) yield n it = filter(_not_divisible(n), it) # 構造新序列 這個生成器先返回第一個素數(shù)2,然后,利用filter()不斷產生篩選后的新的序列。 由于primes()也是一個無限序列,所以調用時需要設置一個退出循環(huán)的條件: # 打印1000以內的素數(shù): for n in primes(): if n < 1000: print(n) else: break 注意到Iterator是惰性計算的序列,所以我們可以用Python表示“全體自然數(shù)”,“全體素數(shù)”這樣的序列,而代碼非常簡潔。 |
|