內建模組 itertools

2021-07-11 14:23:48 字數 1981 閱讀 4913

python的內建模組itertools提供了非常有用的用於操作迭代物件的函式。

首先,我們看看itertools提供的幾個「無限」迭代器:

>>> import itertools

>>> natuals = itertools.count(1)

>>> for n in natuals:

... print(n)

...123

...

因為count()會建立乙個無限的迭代器,所以上述**會列印出自然數序列,根本停不下來,只能按ctrl+c退出。

cycle()會把傳入的乙個序列無限重複下去:

>>> import itertools

>>> cs = itertools.cycle('abc') # 注意字串也是序列的一種

>>> for c in cs:

... print(c)

...'a'

'b''c'

'a''b'

'c'...

同樣停不下來。

repeat()負責把乙個元素無限重複下去,不過如果提供第二個引數就可以限定重複次數:

>>> ns = itertools.repeat('a', 3)

>>> for n in ns:

... print(n)

...a

aa

無限序列只有在for迭代時才會無限地迭代下去,如果只是建立了乙個迭代物件,它不會事先把無限個元素生成出來,事實上也不可能在記憶體中建立無限多個元素。

無限序列雖然可以無限迭代下去,但是通常我們會通過takewhile()等函式根據條件判斷來截取出乙個有限的序列:

>>> natuals = itertools.count(1)

>>> ns = itertools.takewhile(lambda x: x <= 10, natuals)

>>> list(ns)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

itertools提供的幾個迭代器操作函式更加有用:

chain()

chain()可以把一組迭代物件串聯起來,形成乙個更大的迭代器:

>>> for c in itertools.chain('abc', 'xyz'):

... print(c)

# 迭代效果:'a' 'b' 'c' 'x' 'y' 'z'

groupby()

groupby()把迭代器中相鄰的重複元素挑出來放在一起:

>>> for key, group in itertools.groupby('aaabbbccaaa'):

... print(key, list(group))

...a ['a', 'a', 'a']

b ['b', 'b', 'b']

c ['c', 'c']

a ['a', 'a', 'a']

實際上挑選規則是通過函式完成的,只要作用於函式的兩個元素返回的值相等,這兩個元素就被認為是在一組的,而函式返回值作為組的key。如果我們要忽略大小寫分組,就可以讓元素'a'和'a'都返回相同的key:

>>> for key, group in itertools.groupby('aaabbbccaaa', lambda c: c.upper()):

... print(key, list(group))

...a ['a', 'a', 'a']

b ['b', 'b', 'b']

c ['c', 'c']

a ['a', 'a', 'a']

小結

itertools模組提供的全部是處理迭代功能的函式,它們的返回值不是list,而是iterator,只有用for迴圈迭代的時候才真正計算。

Python內建模組之itertools

itertools可以看成是乙個迭代器的工具箱,裡面包含許多函式用以生成各式各樣的迭代器。1 count start 0,step 1 生成以start為起始,step為步長的無限數列 2 cycle iterable 無限迴圈iterable的內容。例如iterable為 abcd 那麼迭代器將返...

Python的內建模組itertools

python的內建模組,提供了非常有用的用於操作迭代物件的函式。並且itertools相當高效且節省記憶體。count 初值 0,步長 1 count 迭代器會返回從傳入的起始引數開始的均勻間隔的數值。count 也可以接收指定的步長引數。from itertools import count fo...

python內建函式itertools

因為count 會建立乙個無限的迭代器,所以上述 會列印出自然數序列,根本停不下來,只能按ctrl c退出。for i in itertools.count 1 print i cycle 會把傳入的乙個序列無限重複下去 for i in itertools.cycle abcd print i r...