生成器和迭代器

2022-01-11 20:47:51 字數 2232 閱讀 8127

for迴圈遍歷的原理

for迴圈遍歷的原理就是迭代,in後面必須是可迭代物件

為什麼要有迭代器

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

__iter__方法的物件,都是可迭代物件,有以下6種

可迭代的物件:python內建str、list、tuple、dict、set、file都是可迭代物件

"zx".__iter__()

["zx"].__iter__()

.__iter__()

("zx",).__iter__()

.__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]

789101112

131415

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

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

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

生成器需要自己處理最後沒有迭代值的異常stopiteration,普通迭代器已經預設實現

關於迭代器和list的區別

list直接把所有資料載入到記憶體

而迭代器是乙個乙個取值,在需要下乙個值的時候才回去計算取出這個值到記憶體(可以把迭代器想象成乙個生成器的**,一次next,執行下面的**,然後返回值)

關於迭代器深入的資訊可以檢視大佬部落格

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...