想遍歷乙個可迭代物件,但是它開始的某些元素你並不感興趣,想跳過它們
itertools 模組中有一些函式可以完成這個任務。首先介紹的是itertools.dropwhile() 函式。使用時,你給它傳遞乙個函式物件和乙個可迭代物件。它會返回乙個迭代器物件,丟棄原有序列中直到函式返回true 之前的所有元素,然後返回後面所有元素。為了演示,假定你在讀取乙個開始部分是幾行注釋的原始檔。
with open('/etc/passwd') as f:... for line in f:
... print(line, end='')
如果你想跳過開始部分的注釋行的話,可以這樣做:
from itertools import dropwhile>>> with open('/etc/passwd') as f:
... for line in dropwhile(lambda line: line.startswith('#'), f):
... print(line, end='')
這個例子是基於根據某個測試函式跳過開始的元素。如果你已經明確知道了要跳過的元素的個數的話,那麼可以使用itertools.islice() 來代替。比如:
from itertools import islice>>> items = ['a', 'b', 'c', 1, 4, 10, 15]
>>> for x in islice(items, 3, none):
... print(x)
...14
1015
>>>
在這個例子中, islice() 函式最後那個none 引數指定了你要獲取從第3 個到最後的所有元素,如果none 和3 的位置對調,意思就是僅僅獲取前三個元素恰恰相反,(這個跟切片的相反操作[3:] 和[:3] 原理是一樣的)。
函式dropwhile() 和islice() 其實就是兩個幫助函式,為的就是避免寫出下面這種冗餘**:
with open('/etc/passwd') as f:# skip over initial comments
while true:
line = next(f, '')
if not line.startswith('#'):
break
# process remaining lines
while line:
# replace with useful processing
print(line, end='')
line = next(f, none)
跳過乙個可迭代物件的開始部分跟通常的過濾是不同的。比如,上述**的第乙個部分可能會這樣重寫:
with open('/etc/passwd') as f:
lines = (line for line in f if not line.startswith('#'))
for line in lines:
print(line, end='')
這樣寫確實可以跳過開始部分的注釋行,但是同樣也會跳過檔案中其他所有的注釋行。換句話講,我們的解決方案是僅僅跳過開始部分滿足測試條件的行,在那以後,所有的元素不再進行測試和過濾了。最後需要著重強調的一點是,本節的方案適用於所有可迭代物件,包括那些事先不能確定大小的,比如生成器,檔案及其類似的物件。
Python 可迭代物件
1.可迭代物件 以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield 的 generator function 這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 2...
python可迭代物件
0 在python中只要是能用for in的,都是可迭代物件,讓我們看下定義 定義 我們已經知道可以對list tuple dict set str等型別的資料使用for in 的迴圈語法,會從其中依次拿到資料元素進行使用,我們把這樣的過程稱為遍歷,也叫迭代。所以我們把可以通過for in 這類語句...
PYTHON 迭代器 可迭代物件
通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...