迭代器函數
'''' ''' ''' 什麼是迭代器 迭代:更新換代的過程,每次迭代必須基於上次迭代的結果 迭代器:迭代取值的工具 能夠迭代取值的數據類型 字符串 列表 元組 集合 字典 如何判斷是不是可迭代對象 內置方法有.__iter__的數據就是可迭代數據 如何判斷迭代器對象? 內置方法有.__iter__ .__next__ 兩種內置方法的稱爲迭代器對象 文件屬於迭代器對象 迭代器對象無論執行多少次.__iter__ 最後仍是迭代器自己 l = [1,2,3,4] iter_f = l.__iter__() print(iter_f is iter_f.__iter__().__iter__().__iter__().__iter__()) # True 內置方法.__iter__ 就是將可迭代對象轉換爲迭代器對象 l = [1,2,3,4] iter_l = l.__iter__() print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) print(iter_l.__next__()) # 迭代次數超過迭代器對象中元素個數時,會報錯StopIteration 異常處理 l = [1,2,3,4] iter_l = l.__iter__() while True: try: print(iter_l.__next__()) except StopIteration: print('取值結束') break 迭代器取值的特色: 只能日後依次取 不能返回再次取值 '''
for循環原理工具
''' for 循環的本質 for循環是將in後面的對象調用.__iter__ 轉換成迭代器對象 調用__next__ 進行迭代取值 內部有異常捕獲StopIteration 當__next__報錯這個錯時,直接結束循環 迭代取值的優缺點 優勢:不依賴索引取值 內存中只佔一個空間,內存不會溢出 缺點:不能索引取值 所有取完再取會報StopIteration '''
生成器spa
''' 生成器:就是 用戶本身定義的迭代去,本質上就是迭代器 def func(): print('hello') yield 在函數定義中出現yield就是表明生產器 可是函數名加括號 不會觸發函數體代碼的運行 ''' def func(): print('cly') yield 1 print('clysb') yield 1,2 print('clydsb') yield 1,2,3,4,5 f = func() # 生成器初始化,將函數變成迭代器 print(f.__next__()) print(f.__next__()) print(f.__next__()) ''' yield關鍵字後面跟的值,就是__next__須要返回的值 yield不能結束函數,但能暫定函數,須要再次__next__取值纔會繼續執行 yield後 返回多個值時,會將多個值以元組的形式返回 yield 與 return的相同點在於 都能返回值,返回多個值都是以元組的形式返回 yield 與 return的不一樣點在於 return能直接結束函數 , yield只是暫停函數 能從外部給yield傳值 def func(): print('今天學了啥') while True: study = yield print(study) f = func() f.__next__() f.send('迭代器') # 內部共作了兩個步驟 給yield左邊的變量傳參,在執行f.__next__一次 # f.__next__() ''' ''' 生成器表達式: f = (i for i in range(10) if i != 4) 這是一個生成器,並非元組生產器 生產器不會主動執行任何一行代碼, 必須經過.__next__觸發代碼執行 ''' def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) # 第一次for循環 add(1,i) for i in test() # 第二次for循環 add(10,i) for i in (add(1,i) for i in test()) print(n) res=list(g)