python-filter()函數(shù)

本文作者:黎智煊休蟹,叩丁狼高級講師。原創(chuàng)文章肤视,轉(zhuǎn)載請注明出處。

filter()函數(shù)

Python內(nèi)建的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']

可見用filter()這個(gè)高階函數(shù)庶喜,關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)“篩選”函數(shù)小腊。

注意到filter()函數(shù)返回的是一個(gè)Iterator,也就是一個(gè)惰性序列久窟,所以要強(qiáng)迫filter()完成計(jì)算結(jié)果秩冈,需要用list()函數(shù)獲得所有結(jié)果并返回list。

用filter求素?cái)?shù)

計(jì)算素?cái)?shù)的一個(gè)方法是埃氏篩法斥扛,它的算法理解起來非常簡單:

首先入问,列出從2開始的所有自然數(shù),構(gòu)造一個(gè)序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一個(gè)數(shù)2稀颁,它一定是素?cái)?shù)芬失,然后用2把序列的2的倍數(shù)篩掉:

3, ~~4~~, 5, ~~6~~, 7, ~~8~~, 9, ~~10~~, 11, ~~12~~, 13, ~~14~~, 15, ~~16~~, 17, ~~18~~, 19, ~~20~~, ...

取新序列的第一個(gè)數(shù)3,它一定是素?cái)?shù)匾灶,然后用3把序列的3的倍數(shù)篩掉:

5, ~~6~~, 7, ~~8~~, ~~9~~, ~~10~~, 11, ~~12~~, 13, ~~14~~, ~~15~~, ~~16~~, 17, ~~18~~, 19, ~~20~~, ...

取新序列的第一個(gè)數(shù)5棱烂,然后用5把序列的5的倍數(shù)篩掉:

7, ~~8~~, ~~9~~, ~~10~~, 11, ~~12~~, 13, ~~14~~, ~~15~~, ~~16~~, 17, ~~18~~, 19, ~~20~~, ...

不斷篩下去,就可以得到所有的素?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ù)”這樣的序列,而代碼非常簡潔霉颠。

想獲取更多技術(shù)干貨对碌,請前往叩丁狼官網(wǎng):http://www.wolfcode.cn/all_article.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒿偎,隨后出現(xiàn)的幾起案子朽们,更是在濱河造成了極大的恐慌,老刑警劉巖诉位,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑脱,死亡現(xiàn)場離奇詭異,居然都是意外死亡苍糠,警方通過查閱死者的電腦和手機(jī)叁丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岳瞭,“玉大人拥娄,你說我怎么就攤上這事⊥ぃ” “怎么了稚瘾?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姚炕。 經(jīng)常有香客問我摊欠,道長,這世上最難降的妖魔是什么钻心? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任凄硼,我火速辦了婚禮,結(jié)果婚禮上捷沸,老公的妹妹穿的比我還像新娘摊沉。我一直安慰自己,他們只是感情好痒给,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布说墨。 她就那樣靜靜地躺著,像睡著了一般苍柏。 火紅的嫁衣襯著肌膚如雪尼斧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天试吁,我揣著相機(jī)與錄音棺棵,去河邊找鬼楼咳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烛恤,可吹牛的內(nèi)容都是我干的母怜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缚柏,長吁一口氣:“原來是場噩夢啊……” “哼苹熏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起币喧,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤轨域,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杀餐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體干发,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年怜浅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铐然。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔬崩。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恶座,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沥阳,到底是詐尸還是另有隱情跨琳,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布桐罕,位于F島的核電站脉让,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏功炮。R本人自食惡果不足惜溅潜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薪伏。 院中可真熱鬧滚澜,春花似錦、人聲如沸嫁怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塘淑。三九已至萝招,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間存捺,已是汗流浹背槐沼。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岗钩。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓逸爵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凹嘲。 傳聞我的和親對象是個(gè)殘疾皇子师倔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容