1、迭代器
迭代器是一個對象,它可以記錄遍歷的相關信息,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器有兩個基本的方法:iter() 和 next()。我們都過命令行工具,了解一下python的底層迭代機制
>>> items = [1,2,3]
>>> it = iter(items)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
上面執行的流程
- 根據給定的可迭代對象生成迭代器
- 從迭代器中重復獲取下一項
- 如果成功獲得了下一項,上一項已經消失
- 如果在獲取下一項時遇到“StopIteration”異常,則停止循環,因為后面沒有其他項了
2、應用
1、不使用for循環實現對可迭代對象便利,可以使用什么實現遍歷呢?
手動的遍歷可迭代對象,使用 next() 函數并在代碼中捕獲 StopIteration 異常
def manual_iter():with open('test.txt') as f:try:while True:line = next(f)print(line, end='')except StopIteration:pass
2、自定義迭代器
Python 中創建自定義迭代器,需要實現一個類,該類必須包含 iter() 和 next() 方法。iter() 方法返回迭代器對象本身,next() 方法返回序列中的下一個元素
class EvenIterator:def __init__(self, lst):self.lst = lstself.index = 0def __iter__(self):return selfdef __next__(self):while self.index < len(self.lst):current = self.lst[self.index]self.index += 1if current % 2 == 0:return currentraise StopIterationmy_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]for i in EvenIterator(my_list):print(i)輸出:
2
4
6
8
10
在上面的示例中定義了一個名為 EvenIterator 的類,該類接受一個列表作為參數。我們實現了 iter() 和 next() 方法來定義迭代器的行為,并在 next() 方法中使用 raise StopIteration 來指示迭代結束。