迭代器和生成器

2021-09-13 14:38:48 字數 2310 閱讀 9227

生成器:

可以理解為一種資料型別,可自動實現迭代器協議,可以理解為生成器就是可迭代物件(其他資料型別可呼叫內建地__iter__(),如果沒有內建的__iter__(),即不可迭代)

狀態掛起:使用yield語句返回乙個值。使該函式掛起該生成器函式的狀態,保留資訊,以便之後從它離開的地方繼續執行

優點:延遲計算 一次返回乙個結果 ,等待下次需要再繼續返回結果(處理較大的資料可以使用  )

迭代器:

迭代器協議是指:物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項 要麼引起乙個stopiteration異常,以終止迭代(只能往後走 不能往前退)

可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個__iter()__方法

協議:協議是一種約定,可迭代物件實現了迭代器協議(for sum min max 使用迭代器協議訪問物件)

1.生成器函式:

使用yield函式並非return語句

def test() 

yield 1 #可多個返回值 return只能乙個

yield 2

yeild 3

print(test())

g=test()#g:生成器 自動實現迭代器協議

print(g.__next__())g=test()#g:生成器 自動實現迭代器協議

print(g.__next__())

1 # iter_l =x.__iter__()#遵循迭代器協議,生成可迭代物件

2 # print(iter_l.__next__())#for迴圈和索引沒關係 基於迭代器機制

3 # python 中for迴圈的強大之處在於可以遍歷序列和非序列型別 例如檔案

4 f = open('位元組方式與檔案','r+',encoding='utf-8')

5 text_f =f.__iter__()

6 print(text_f.__next__(),end='')

7 print(text_f.__next__())

8 print(text_f.__next__())

補充知識:三元表示式:

name='guoguo'

'tt' if name=='guoguo' else 'ff'【三元表示式】【如果name=guoguo 則返回tt 否則返回ff】

賦值給result得到結果

result=『tt』 if name=='guoguo' else 'ff'

print(result)

補充知識:列表解析:(缺點:生成列表 放入記憶體中 若該列表過大則占用記憶體較大)

缺點:占用記憶體大、效率低

1 egg_list =

2 for i in range(10):

4 print(egg_list)

5 6 列表解析:

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

l = ['雞蛋%s' %i for i in range(10) if i>5]#三元表示式:'雞蛋%s' %i  for i in range(10)  if i>5

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

8 print(l)

生成器表示式:

1 laomuji=('雞蛋%s' %i for i in range(10))#生成器表示式(直接實現迭代器協議)

2 print(laomuji)#生成器

3 print(laomuji.__next__())#執行結果:雞蛋0

4 print(laomuji.__next__())#執行結果:雞蛋1

5 print(laomuji.__next__())#執行結果:雞蛋2

6 print(laomuji.__next__())#執行結果:雞蛋3

7 print(next(laomuji))# 生成器只能遍歷一次。否則報錯。執行結果:雞蛋4【小於等於雞蛋9 大於則報錯 有界限 大於則stopiteration】

總結:

1.把列表解析的換成()則為生成器表示式

2.列表解析與生成器表示式都為便利的程式設計方式,但是生成器相對更節省記憶體【乙個乙個取值  next()】

3.python使用迭代器協議 使for迴圈更通暢,而且大部分內建函式也使用迭代器協議 map() sum() max() min() reduce() filter()

收藏

生成器和迭代器

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