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...