迭代器和生成器

2022-09-11 03:30:13 字數 2355 閱讀 4089

生成器:

可以理解為一種資料型別,可自動實現迭代器協議,可以理解為生成器就是可迭代物件(其他資料型別可呼叫內建地__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__())

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 =

2for i in range(10):

雞蛋%s

',%i)

4print

(egg_list)56

列表解析:

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 ]#錯誤 沒有四元表示式

8print(l)

生成器表示式:

1 laomuji=('

雞蛋%s

' %i for i in range(10))#

生成器表示式(直接實現迭代器協議)

2print(laomuji)#

生成器3

print(laomuji.__next__())#

執行結果:雞蛋0

4print(laomuji.__next__())#

執行結果:雞蛋1

5print(laomuji.__next__())#

執行結果:雞蛋2

6print(laomuji.__next__())#

執行結果:雞蛋3

7print(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...