迭代器和生成器

2021-08-30 04:13:36 字數 2300 閱讀 4504

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

2、可迭代物件:實現了迭代器協議的物件(如何實現:物件定義乙個__iter__()方法 )(即內建有__iter__方法的物件)

3、協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件

4、迭代器物件:可迭代物件執行obj.__itre__()得到的結果就是迭代器物件,即指內建有__iter__又內建有__next__方法的物件

例如: open('a.txt').__iter__()     open('a.txt').__next__()

注意:迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件

dic=

iter_dic=dic.__iter__() #得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身

iter_dic.__iter__() is iter_dic #true

print(iter_dic.__next__()) #等同於next(iter_dic)

for迴圈的本質:for迴圈所有物件,全都是使用迭代器協議,基於迭代器協議提供

#基於for迴圈,我們可以完全不再依賴索引去取值

dic=

for k in dic:

print(dic[k])

#for迴圈的工作原理

#1:執行in後物件的dic.__iter__()方法,得到乙個迭代器物件iter_dic

#2:執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體**

#3:重複過程2,直到捕捉到異常stopiteration,結束迴圈

#for迴圈可以迴圈函式,這是其他語言沒有的

def test():

for i in range(1000):

yield '雞蛋%s'%i

mj=test()

for jidan in mj:

print(jidan)

優點:1、提供一種統一的,不依賴於索引的迭代方式

2、惰性計算,節省記憶體

缺點:1、無法獲取長度(只有在next完畢才知道到底有幾個值)

2、一次性的,只能往後走,不能往前退(要注意之前__next__到哪個位置)

可以理解為一種資料型別,其自動實現了迭代器協議 (其他的資料型別需要呼叫自己內建的__iter__方法),所以生成器就是可迭代物件。

1、生成器函式:常規函式定義,但是使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方繼續執行。

iter.__next__()    iter.__next__()         不會重新從頭開始執行

2、生成器表示式:類似於列表推導,但是生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。

例如:(i for i in range(10))

#列表解析

['雞蛋%s'%i for i in range(10)]

['雞蛋%s'%i for i in range(10) if i>5] #內部是三元表示式

['雞蛋%s'%i for i in range(10) if i>5 else i] #錯誤,這是四元,沒有四元表示式

#生成器表示式

('雞蛋%s'%i for i in range(10) if i>5)

第一種方法:(其中 l 占用記憶體)

l=[1,2,3,4] # l=list(range(1000))

print(sum(l))

第二種方法:(節省記憶體)

print(sum(i for i in range(10000000)))

總結:1、把列表解析的 換成 () 得到的就是生成器表示式

2、列表解析與生成器表示式都是一種便利的程式設計方式,只不過生成器更省記憶體

3、python使用迭代器協議,讓for迴圈變得更加通用。大部分內建函式都是使用迭代器協議訪問物件

優點:1、延遲操作。在需要的時候才產生結果,而不是立即產生結果,節省記憶體

1、是可迭代物件

2、實現了延遲計算,節省記憶體

3、生成器本質和其他的資料型別一樣,都是實現了迭代器協議,只不過生成器附加了乙個延遲計算省記憶體的好處,其餘的可迭代物件沒有這個好處

生成器和迭代器

可以直接作用於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...