前言
本文主要介紹Python中的迭代器和生成器,主要內容包括 迭代器概述、生成器簡介。
文章目錄
- 前言
- 一、迭代器簡介
- 二、生成器簡介
一、迭代器簡介
在 Python 中,迭代器(iterator)是一個實現了迭代器協議(Iterator Protocol)的對象。該協議包含兩個方法:iter() 和 next() 方法。iter() 方法返回迭代器對象本身,next() 方法返回迭代器中的下一個元素,在迭代結束時需要拋出StopIteration 異常,如:
my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator)) # 再次調用 next() 方法將引發 StopIteration 異常
print(next(my_iterator))
輸出結果:
1
2
3
4
5
Traceback (most recent call last):File "D:\pythonCode\hello.py", line 11, in <module>print(next(my_iterator))^^^^^^^^^^^^^^^^^
StopIteration
iter() 方法還接受一個可選的參數,用于指定當迭代器對象中沒有剩余的元素時,返回的默認值。如果不指定該參數,則默認會引發 StopIteration 異常。例如:
my_list = [1, 2, 3]
my_iterator = iter(my_list)print(next(my_iterator, 0))
print(next(my_iterator, 0))
print(next(my_iterator, 0)) # 再次調用 next() 方法將返回指定的默認值 0
print(next(my_iterator, 0))
輸出結果:
1
2
3
0
我們平時在使用 for 循環語句遍歷可迭代對象時,好像并沒有顯性使用iter()方法,如:
my_list = [1, 2, 3]for item in my_list:print(item) # 輸出 1, 2, 3
實際上在遍歷所有對象時,python內部的實現依舊是會自動調用 iter() 函數來獲取其對應的迭代器對象,然后再不斷調用迭代器對象的 next() 方法來獲取其中的元素,直到拋出 StopIteration 異常。這個流程如下圖:
注意:迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只能往前不會后退。
二、生成器簡介
在 Python 中,使用了 yield 的函數被稱為生成器(generator)。跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器是一種特殊的迭代器,可以按需生成值而不是一次性生成所有值。這種特性使得生成器非常適合處理大量的數據,尤其是在處理一些無法完全載入內存的數據集的情況下,如使用 yield 實現斐波那契數列:
def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + b#輸出斐波那契數列的前 10 個數字
f = fibonacci()
for i in range(10):print(next(f)) # 輸出結果 0 1 1 2 3 5 8 13 21 34
上面的代碼中,fibonacci() 函數的執行被設置成一個無限循環,這個循環在每次yield 語句之后暫停,生成器對象返回當前的值,并且在下一個循環迭代中繼續執行,而不是一次性輸出所有的斐波那契數值。這種按需生成數值的方法可以大大減少內存使用,特別是當在生成的數值上花費了很多計算時間時。