18 - 迭代器&生成器

返回主頁

📄目錄

1 可迭代對象 Iterable

含義:可以通過for...in...這類語句遍歷讀取數據的對象稱之為可迭代對象

遍歷(迭代):從對象中依次把多個元素取出的過程

類據類型:str、list、tuple、dict、set等

python-logo

輸出結果:

1.1 可迭代對象的條件

  1. 對象實現了__iter__()方法

  2. __iter__()方法返回了迭代器對象

1.2 for循環工作原理

  1. 先通過__iter__()獲取可迭代對象的迭代器

  2. 對獲取到的迭代器不斷調用__next__()方法來獲取下一個值並將賦值給臨時變量

1.3 isinstance():判斷一個對象是否可迭代對象/已知的數據類型

isinstance(o, t)

python-logo

輸出結果:

2 迭代器

是一個可以記住遍歷位置的對象;在上次停留的位置繼續去做一些事情

💡 兩個關鍵函數:

python-logo

輸出結果:

步驟:

  1. iter()調用對象的__iter__(),並把__iter__()方法的返回結果作為自己的返回值

  2. next()調用對象的__next__(),一個一個地取元素

  3. 所有元素都被取完了,__next__()將會引發StopIteration異常

python-logo

第二種方式:

輸出結果:

2.1 可迭代對象(Iterable)和迭代器(Iterator)

python-logo

輸出結果:

💡 總結:

  1. 可迭代對象可以通過iter()方法轉換成迭代器對象

  2. 如果一個對象擁有__iter__(),是可迭代對象

  3. 如果一個對象擁有__next__()__iter__()方法,是迭代器對象

  4. dir():查看對象中的屬性和方法

python-logo

查詢例子:

輸出結果:

2.2 迭代器協議

對象必須提供一個next方法,執行該方法要麼就返回迭代中的下一項,否則就引發StopIteration異常,來終止迭代

2.3 自定義迭代器類

兩個特性:擁有__next__()__iter__()方法

python-logo⚠️⚠️

⚠️⚠️ 錯誤示範:

輸出結果:

python-logo

✅正確例子:

輸出結果:

3 生成器 generator

  1. Python中,一邊循環、一邊計算的機制,叫做生成器

  2. Python提供的一種非常簡便的語法能讓我們來自己寫出迭代器

  3. 使用yield的函數被稱為生成器(generator)

3.1 生成器表達式

python-logo

輸出結果:

3.2 生成器函數

💡 Python中,使用yield的函數被稱為生成器函數

yield的作用:

  1. 類似return,將指定值或者多個值返回給調用者

  2. yield的語句一次返回一個結果,在每個結果中間,掛起函數,執行__next__()函數,再重新掛起點繼續往下執行

  3. 簡單來說就是:使函數中斷,並保存中斷的狀態

python-logo⚠️⚠️

⚠️⚠️錯誤示範:

輸出結果:

python-logo⚠️⚠️

⚠️⚠️(效果出來了,但沒有使用yield函數):

輸出結果:

3.2.1 生成器函數例子1

python-logo

輸出結果:

3.2.2 生成器函數例子2

python-logo

輸出結果:

4 三者關係

可迭代對象⫌迭代器⫌生成器

  1. 可迭代對象:指實現了python迭代協議,可以通過for ... in ...循環遍歷的對象,比如list、dict、str等,以及迭代器與生成器

  2. 迭代器:可以記住自己遍歷位置的對象,直觀體現就是可以使用next()函數返回值。迭代器只能往前,不能往後。當遍歷完畢後,next()會抛出異常

    ⚠️迭代器不一定是生成器

  3. 生成器:是特殊的迭代器。是Python提供的通過簡便方法寫出迭代器的一種手段

導航連結:

目的地超連結
首頁返回主頁
Python學習Python學習
上一篇17 - 文件讀寫
下一篇19 - 線程