Python 迭代器的使用

先了解一下可迭代對象

說到迭代器就必須先要提一下可迭代對象(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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章