相見恨晚的 Python 內(nèi)置庫:itertools
來源 : 憶先
很多人都致力于把Python代碼寫得更Pythonic,一來更符合規(guī)范且容易閱讀,二來一般Pythonic的代碼在執(zhí)行上也更有效率。今天就先給大家介紹一下Python的系統(tǒng)庫itertools。
02 itertools庫
迭代器(生成器)在Python中是一種很常用也很好用的數(shù)據(jù)結(jié)構(gòu),比起列表(list)來說,迭代器最大的優(yōu)勢就是延遲計算,按需使用,從而提高開發(fā)體驗(yàn)和運(yùn)行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。
話雖這么說但大家平時用到的迭代器大概只有range了,而通過iter函數(shù)把列表對象轉(zhuǎn)化為迭代器對象又有點(diǎn)多此一舉,這時候我們今天的主角itertools就該上場了。
03 使用itertools
itertools中的函數(shù)大多是返回各種迭代器對象,其中很多函數(shù)的作用我們平時要寫很多代碼才能達(dá)到,而在運(yùn)行效率上反而更低,畢竟人家是系統(tǒng)庫。
itertools.accumulate
簡單來說就是累加。
>>>?import?itertools
>>>?x?=?itertools.accumulate(range(10))
>>>?print(list(x))
[0,?1,?3,?6,?10,?15,?21,?28,?36,?45]
連接多個列表或者迭代器。
>>>?x?=?itertools.chain(range(3),?range(4),?[3,2,1])
>>>?print(list(x))
[0,?1,?2,?0,?1,?2,?3,?3,?2,?1]
>>>?x?=?itertools.combinations(range(4),?3)
>>>?print(list(x))
[(0,?1,?2),?(0,?1,?3),?(0,?2,?3),?(1,?2,?3)]
>>>?x?=?itertools.combinations_with_replacement('ABC',?2)
>>>?print(list(x))
[('A',?'A'),?('A',?'B'),?('A',?'C'),?('B',?'B'),?('B',?'C'),?('C',?'C')]
>>>?x?=?itertools.compress(range(5),?(True,?False,?True,?True,?False))
>>>?print(list(x))
[0,?2,?3]
>>>?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]
>>>?x?=?itertools.cycle('ABC')
>>>?print(list(itertools.islice(x,?0,?10,?1)))
['A',?'B',?'C',?'A',?'B',?'C',?'A',?'B',?'C',?'A']
>>>?x?=?itertools.dropwhile(lambda?e:?e?5,?range(10))
>>>?print(list(x))
[5,?6,?7,?8,?9]
>>>?x?=?itertools.filterfalse(lambda?e:?e?5,?(1,?5,?3,?6,?9,?4))
>>>?print(list(x))
[5,?6,?9]
>>>?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]
>>>?x?=?itertools.islice(range(10),?0,?9,?2)
>>>?print(list(x))
[0,?2,?4,?6,?8]
>>>?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)]
>>>?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)]
>>>?x?=?itertools.repeat(0,?5)
>>>?print(list(x))
[0,?0,?0,?0,?0]
>>>?x?=?itertools.starmap(str.islower,?'aBCDefGhI')
>>>?print(list(x))
[True,?False,?False,?False,?True,?True,?False,?True,?False]
>>>?x?=?itertools.takewhile(lambda?e:?e?5,?range(10))
>>>?print(list(x))
[0,?1,?2,?3,?4]
>>>?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]
>>>?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)]
對比Excel系列圖書累積銷量達(dá)15w冊,讓你輕松掌握數(shù)據(jù)分析技能,可以在全網(wǎng)搜索書名進(jìn)行了解:
評論
圖片
表情

