一個(gè)零差評(píng)的 Python 內(nèi)置庫(kù)

很多人都致力于把Python代碼寫得更Pythonic,一來更符合規(guī)范且容易閱讀具则,二來一般Pythonic的代碼在執(zhí)行上也更有效率即纲。今天就先給大家介紹一下Python的系統(tǒng)庫(kù)itertools。

itertools庫(kù)

迭代器(生成器)在Python中是一種很常用也很好用的數(shù)據(jù)結(jié)構(gòu)博肋,比起列表(list)來說低斋,迭代器最大的優(yōu)勢(shì)就是延遲計(jì)算,按需使用束昵,從而提高開發(fā)體驗(yàn)和運(yùn)行效率拔稳,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。

話雖這么說但大家平時(shí)用到的迭代器大概只有range了锹雏,而通過iter函數(shù)把列表對(duì)象轉(zhuǎn)化為迭代器對(duì)象又有點(diǎn)多此一舉巴比,這時(shí)候我們今天的主角itertools就該上場(chǎng)了。

使用itertools

itertools中的函數(shù)大多是返回各種迭代器對(duì)象礁遵,其中很多函數(shù)的作用我們平時(shí)要寫很多代碼才能達(dá)到轻绞,而在運(yùn)行效率上反而更低,畢竟人家是系統(tǒng)庫(kù)佣耐。

itertools.accumulate

簡(jiǎn)單來說就是累加政勃。

>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
itertools.chain

連接多個(gè)列表或者迭代器。

>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]
itertools.combinations

求列表或生成器中指定數(shù)目的元素不重復(fù)的所有組合

>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
itertools.combinations_with_replacement

允許重復(fù)元素的組合

>>> x = itertools.combinations_with_replacement('ABC', 2)
>>> print(list(x))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
itertools.compress

按照真值表篩選元素

>>> x = itertools.compress(range(5), (True, False, True, True, False))
>>> print(list(x))
[0, 2, 3]
itertools.count

就是一個(gè)計(jì)數(shù)器,可以指定起始位置和步長(zhǎng)

>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0, 10, 1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
itertools.cycle

循環(huán)指定的列表和迭代器

>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0, 10, 1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']
itertools.dropwhile

按照真值函數(shù)丟棄掉列表和迭代器前面的元素

>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]
itertools.filterfalse

保留對(duì)應(yīng)真值為False的元素

>>> x = itertools.filterfalse(lambda e: e < 5, (1, 5, 3, 6, 9, 4))
>>> print(list(x))
[5, 6, 9]
itertools.groupby

按照分組函數(shù)的值對(duì)元素進(jìn)行分組

>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)                                                                                                
>>> for condition, numbers in x:                                                  
...     print(condition, list(numbers))                                                                                                        
True [0, 1, 2, 3, 4]                                                              
False [5, 6, 7, 8]                                                                
True [9]
itertools.islice

上文使用過的函數(shù)兼砖,對(duì)迭代器進(jìn)行切片

>>> x = itertools.islice(range(10), 0, 9, 2)
>>> print(list(x))
[0, 2, 4, 6, 8]
itertools.permutations

產(chǎn)生指定數(shù)目的元素的所有排列(順序有關(guān))

>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0,3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)]
itertools.product

產(chǎn)生多個(gè)列表和迭代器的(積)

>>> x = itertools.product('ABC', range(3))
>>>
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]
itertools.repeat

簡(jiǎn)單的生成一個(gè)擁有指定數(shù)目元素的迭代器

>>> x = itertools.repeat(0, 5)
>>> print(list(x))
[0, 0, 0, 0, 0]
itertools.starmap

類似map

>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[True, False, False, False, True, True, False, True, False]
itertools.takewhile

與dropwhile相反奸远,保留元素直至真值函數(shù)值為假既棺。

>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]
itertools.tee

這個(gè)函數(shù)我也不是很懂,似乎是生成指定數(shù)目的迭代器

>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
...     print(list(letters))
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
itertools.zip_longest

類似于zip懒叛,不過已較長(zhǎng)的列表和迭代器的長(zhǎng)度為準(zhǔn)

>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
>>> print(list(y))
[(0, 0), (1, 1), (2, 2)]

結(jié)語(yǔ)

大概就總結(jié)到這里丸冕,不過老實(shí)說Python的各種語(yǔ)言特性和庫(kù)還是要多用才能熟練,最終達(dá)到隨手拈來的程度薛窥,裝逼的說就是由術(shù)入道胖烛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诅迷,隨后出現(xiàn)的幾起案子佩番,更是在濱河造成了極大的恐慌,老刑警劉巖罢杉,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趟畏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屑那,警方通過查閱死者的電腦和手機(jī)拱镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持际,“玉大人沃琅,你說我怎么就攤上這事≈┯” “怎么了益眉?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姥份。 經(jīng)常有香客問我郭脂,道長(zhǎng),這世上最難降的妖魔是什么澈歉? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任展鸡,我火速辦了婚禮,結(jié)果婚禮上埃难,老公的妹妹穿的比我還像新娘莹弊。我一直安慰自己,他們只是感情好涡尘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布忍弛。 她就那樣靜靜地躺著,像睡著了一般考抄。 火紅的嫁衣襯著肌膚如雪细疚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天川梅,我揣著相機(jī)與錄音疯兼,去河邊找鬼然遏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镇防,可吹牛的內(nèi)容都是我干的啦鸣。 我是一名探鬼主播潮饱,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼来氧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了香拉?” 一聲冷哼從身側(cè)響起啦扬,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凫碌,沒想到半個(gè)月后扑毡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盛险,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瞄摊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苦掘。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡换帜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹤啡,到底是詐尸還是另有隱情惯驼,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布递瑰,位于F島的核電站祟牲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抖部。R本人自食惡果不足惜说贝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慎颗。 院中可真熱鬧乡恕,春花似錦、人聲如沸哗总。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讯屈。三九已至蛋哭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涮母,已是汗流浹背谆趾。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工躁愿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沪蓬。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓彤钟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跷叉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逸雹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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