明確 python迭代器與生成器的區別 (轉)

迭代 生成

for循環遍歷的原理

for循環遍歷的原理就是迭代,in後面必須是可迭代對象

爲什麼要有迭代器

對於序列類型:字符串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器

1.可迭代對象

__iter__方法的對象,都是可迭代對象,有以下6種

可迭代的對象:Python內置str、list、tuple、dict、set、file都是可迭代對象

"zx".__iter__() ["zx"].__iter__() {"zx":"wl"}.__iter__() ("zx",).__iter__() {"z","x"}.__iter__() with open("prize.txt","r") as file: file.__iter__()

2.迭代器對象

1.可迭代的對象執行__iter__方法得到的返回值是迭代器對象。2.迭代器對象指的是即內置有__iter__又內置有__next__方法的對象

list=[1,2,3,4,5,6] zx=list.__iter__() while True: try: print(zx.__next__()) except: break

文件類型是迭代器對象

open('a.txt').__iter__() open('a.txt').__next__()

迭代器對象一定是可迭代對象,而可迭代對象不一定是迭代器對象

生成器

生成器就是一種迭代器。迭代器有一個特點就是可以被next()函數調用並不斷返回下一個值的對象,並且只能迭代它們一次。原因很簡單,因爲它們不是全部存在內存裏,它們只在要調用的時候在內存裏生成。

生成器就是迭代器(函數返回的結果就是生成器,而且它同時有__iter____next__

def zx(): yield 1 yield 2 x=zx()

x._next()
x._iter()

實驗室

每次__next__之後,會執行到相應的yield不會執行下面的內容。

爲啥?這個實驗執行了呢,因爲用了for,他不知道最後執行到哪裏,他就會一直__next__,直到最後拋出異常,然而for in裏面自帶捕獲異常的內容,所有沒有打印異常信息。

def func(): yield [1,1,23] # yield會使函數func()變成生成器對象,因此他就具有__iter__方法 print(789) # yield會停止函數,當運行下一次next纔會繼續運行下面的代碼 yield 101112 # 一個yield對應一個next print(131415)

g = func()
for i in g:
print(i)

[1, 1, 23]
789
101112
131415

關於迭代器和和生成器的區別

生成器是一種特殊的迭代器,生成器實現了迭代器協議--iter--,--next--

生成器是可以改變迭代的值的,然而迭代器隨意改值會有問題

關於迭代器和list的區別

list直接把所有數據加載到內存

而迭代器是一個一個取值,在需要下一個值的時候纔回去計算取出這個值到內存(可以把迭代器想象成一個生成器的代碼,一次next,運行下面的代碼,然後返回值)

關於迭代器深入的信息可以查看大佬博客
https://www.cnblogs.com/deeper/p/7565571.html

發佈了57 篇原創文章 · 獲贊 15 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章