生成器:
可以理解為一種資料型別,可自動實現迭代器協議,可以理解為生成器就是可迭代物件(其他資料型別可呼叫內建地__iter__(),如果沒有內建的__iter__(),即不可迭代)
狀態掛起:使用yield語句返回乙個值。使該函式掛起該生成器函式的狀態,保留資訊,以便之後從它離開的地方繼續執行
優點:延遲計算 一次返回乙個結果 ,等待下次需要再繼續返回結果(處理較大的資料可以使用 )
迭代器:
迭代器協議是指:物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項 要麼引起乙個stopiteration異常,以終止迭代(只能往後走 不能往前退)1.生成器函式:可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個__iter()__方法
協議:協議是一種約定,可迭代物件實現了迭代器協議(for sum min max 使用迭代器協議訪問物件)
使用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...