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