#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器協議: ``` 1、迭代器協議是指:物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項, 要麼就引起一個StopIteration異常,已終止迭代,只能往後走,不能往前退. 2、可迭代物件:實現了迭代器協議的物件(物件內部定義一個__iter__()方法),節省記憶體 3、協議是一種約定,可迭代物件實現了迭代器協議,Python的內部工具(如for、sum、min、max等) 使用迭代器協議訪問物件。 ``` #for 迴圈的強大功能 ``` 字串,列表,元祖,字典,集合。這些都不是可迭代物件(沒有next方法),在for 迴圈中,呼叫了他們的內部 __iter__方法,把他們變成了可迭代物件。 for迴圈呼叫可迭代物件的__next__方法去取值,並且for 迴圈可以捕捉StopIteration異常,終止迭代。 ``` # l_test=[1,2,3] # iter_l_test=l_test.__iter__() # print(iter_l_test.__next__()) # print(iter_l_test.__next__()) # print(iter_l_test.__next__()) # print(iter_l_test.__next__()) # # 1 # # 2 # # 3 # # Traceback (most recent call last): # # File "D:/python3/app/Module_and_Functions/iterator_and_generator.py", line 28, in <module> # # print(iter_l_test.__next__()) # # StopIteration #用whilex迴圈模擬for迴圈 # l_test=[1,2,3] # iter_l_test=l_test.__iter__() # while True: # try: # #print(iter_l_test.__next__()) # print(next(iter_l_test)) # except StopIteration: # #print(`end`) # break #生成器 ``` 生成器也是一種資料型別,這種資料型別自動實現了“迭代器協議”,生成器是可迭代物件。 生成器分類: 1、生成器函式:常規函式定義,但是使用yield語句而不是return 語句返回結果,yield語句 一次返回一個結果,可以使用多次,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方 繼續執行。 2、生成器表示式:類似列表推導式,生成器返回按需產生結果的一個物件,而不是一次構建 一個完整的結果列表 生成器優點: 在需要的時候才產生結果,不是立即產生結果 ``` #生成器函式 # def g_test(): # yield 1 # yield 2 # yield 3 # g_test1=g_test() # print(g_test1) # print(g_test1.__next__()) # print(g_test1.__next__()) # print(g_test1.__next__()) # # <generator object g_test at 0x0000000002163570> # # 1 # # 2 # # 3 #生成器表示式,大資料不會佔用大記憶體 # l_g = (`%s` %i for i in range(10) if i%2 == 0) # print(l_g) # print(l_g.__next__()) # print(l_g.__next__()) #print(next(l_g)) # print(l_g.__next__()) # <generator object <genexpr> at 0x0000000002133570> # 0 # 2 # 4 # 6 #三元表示式 # name = `test` # res=`True` if name == `test` else `False` # print(res) # True #列表解析,大資料佔用記憶體比較大 # l_test1=[`%s` %i for i in range(10)] # l_test2=[`%s` %i for i in range(10) if i%2 == 0] # print(l_test1) # print(l_test2) # [`0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`] # [`0`, `2`, `4`, `6`, `8`] #生成器總結 ``` 1、節省記憶體 2、提高程式碼可讀性 3、只能遍歷一次,只能遍歷一次,只能遍歷一次 ```