先了解一下可迭代對象
說到迭代器就必須先要提一下可迭代對象(iterable),可迭代對象是能夠逐一返回其成員項的對象。可迭代對象包括序列類型(如list、str、tuple)和非序列類型(如dict、文件對象、定義 __iter__()
方法或實現了 Sequence
語義的 __getitem__()
方法的任意自定義類對象。)。一個可迭代對象都有一個 __iter__()
方法,也就是說有 __iter__()
方法的對象,就是可迭代對象。
迭代器
在Python中,迭代器是遵循迭代協議的對象,用來表示一連串數據流。重複調用迭代器的__next__()
方法(或將其傳給內置函數 next())將逐個返回數據流中的項。當沒有數據可用時則將引發 StopIteration
異常。
迭代器分爲兩類:
- 使用
iter()
從任何序列對象中得到迭代器(如list, tuple, dict, set等)。 - 輸入迭代器
generator
(包括生成器和帶yield
的函數)。
迭代器有兩個基本方法:
iter()
返回一個迭代器對象next()
逐一返回迭代對象中的項
迭代器的使用
使用 iter() 返回迭代器
In [1]: list = ['A', 'B', 'C']
In [2]: iters = iter(list)
In [3]: print(next(iters))
A
In [4]: print(next(iters))
B
In [5]: print(next(iters))
C
In [6]: print(next(iters))
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-6-9689206231f0> in <module>
----> 1 print(next(iters))
StopIteration:
list 是長度爲3的列表,使用list作爲參數返回的迭代器中可迭代的項目也只有3個,當超出可迭代的範圍時將引發 StopIteration
異常。
使用 for 遍歷迭代器
迭代器對象可以使用for語句進行遍歷。
list = ['A', 'B', 'C']
iters = iter(list)
for i in iters:
print(i)
輸出結果:
A
B
C
文件迭代
逐行讀取文本文件的內容
for i in open("test.txt", encoding="utf-8"):
print(i)
自定義迭代器
一個類通過實現 __iter__()
與 __next__()
方法來創建一個迭代器。
迭代器必須有 __iter__()
方法用來返回該迭代器對象自身。
class MyIter:
def __init__(self, m):
self.data = m
self.length = len(m)
self.index = -1
def __iter__(self):
return self
def __next__(self):
if self.index < self.length-1:
self.index += 1
else:
raise StopIteration
return self.data[self.index]
# def next(self): # Python2 中使用next()
# if self.index < self.length-1:
# self.index += 1
# else:
# raise StopIteration
# return self.data[self.index]
iters = MyIter(['A', 'B', 'C'])
for i in iters:
print(i)
# print(next(iters))
# print(next(iters))
# print(next(iters))