迭代器,生成器

2021-10-12 21:52:58 字數 4137 閱讀 1450

迭代器:具有迭代物件容器,乙個可以記住遍歷的位置物件

生成器:使用了yield函式被稱為生成器(generator)

字串,元組,列表都可以建立迭代器

a =[1

,2,3

]iteration =

iter

(a)#建立迭代器

print

(next

(iteration)

)#開始輸出迭代器的下乙個元素

print

(next

(iteration)

)print

(next

(iteration)

)

結果:

1

23

我們再試試多出列表元素的next函式

a =[1

,2,3

]iteration =

iter

(a)#建立迭代器

print

(next

(iteration)

)#開始輸出迭代器的下乙個元素

print

(next

(iteration)

)print

(next

(iteration)

)print

(next

(iteration)

)

結果:

123

traceback (most recent call last)

: file "c:/users/魑魅魍魎/desktop/飛機大戰/main.py"

, line 6,in

print

(next

(iteration)

)stopiteration

發現報錯:stopiteration,我們相信可以用什麼方法解決報錯?

那就是異常處理

例子:

try

: a =[1

,2,3

] iteration =

iter

(a)#建立迭代器

print

(next

(iteration)

)#開始輸出迭代器的下乙個元素

print

(next

(iteration)

)print

(next

(iteration)

)print

(next

(iteration)

)except stopiteration:

pass

結果:

1

23

我們還可以使用迭代器模擬for i in iteration迴圈

a =[1

,2,3

,4,5

,6,7

,8,9

]a =

iter

(a)try

:while

true

:print

(next

(a))

except stopiteration:

pass

迭代器和可迭代物件從某種層面說是乙個東西,只是迭代器(**iter(可迭代物件)**後)可以用next實現一步一步的遍歷內容.而可以使用next()的方法就是乙個迭代器

本質上還是迭代器的一種

特點:

def

func()

:print

("**********1**********"

)yield

111111111111

print

("**********2**********"

)yield

222222222222

print

("**********3**********"

)yield

333333333333

print

("**********4**********"

)# 這就是類似於函式邏輯

a =func(

)#必須有這一步,類似例項化

print

(next

(a))

結果:

==

====

====1==

====

====

111111111111

如果執行兩次呢?

print

(next

(a))

print

(next

(a))

結果:

==

====

====1==

====

====

111111111111

====

*****=2

====

====

==222222222222

這就是特點2,顯式的暫停(yield)和恢復(next)

暫停在yield

那麼何為隱式的迭代協議呢???例:

def

func()

:print

("**********1**********"

)yield

111111111111

print

("**********2**********"

)yield

222222222222

print

("**********3**********"

)yield

333333333333

print

("**********4**********"

)a = func(

)# 必須有這一步,類似例項化

print

(next

(a))

print

(next

(a))

print

(next

(a))

print

(next

(a))

結果:

==

====

====1==

====

====

111111111111

====

*****=2

====

====

==222222222222

====

*****=3

====

====

==333333333333

====

*****=4

====

====

==traceback (most recent call last)

: file "c:/users/魑魅魍魎/desktop/飛機大戰/main.py"

, line 15,in

print

(next

(a))

stopiteration

這就是特點三,依然像迭代器一樣順序執行,當超出範圍沒有暫停就報錯

生成器可以省記憶體,需要多少就執行多少,而不會像列表一樣,需要提前寫好一大串!

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...

迭代器 生成器

迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...