python3 語法小記(三) 關鍵字yield
阿新 • • 發佈:2019-01-10
為了理解什麼是yield,必須理解什麼是生成器,理解生成器之前,先了解迭代。
1.可迭代物件
當建立了一個列表,可以逐項地讀取這個列表,這叫做一個可迭代物件:
mylist = [x*x for x in range(3)]
for i in mylist:
print(i)
0
1
4
所有可以使用for...in...語法的叫做一個迭代器;列表、字串、檔案.....經常使用它們是因為你可以如願以償的讀取其中的元素,但是這樣把所有的值都儲存到了記憶體中,如果有大量的資料時,這個方法並不是可行的。
2.生成器
生成器是可以迭代的,但是隻能讀取迭代物件一次,因為生成器並不是把所有的值都放在記憶體中,它是實時的生成資料:
genertor = (x*x for x in range(3))
for i in genertor:
print(i)
0
1
4
看起來除了把[ ]換成()外沒什麼不同,但是,在生成器中,不能再次使用for i in genertor:,(當再次執行這個迴圈時,不會打印出任何結果),因為生成器只能被迭代一次,先計算出0,然後繼續計算1,最後計算4,一個跟一個的計算......
3.yield關鍵字
yield是一個類似return的關鍵字,只是這個函式返回的是一個生成器:
def creatGenerator(): for x in range(3): yield x*x genertor = creatGenerator() print(genertor) >>><generator object creatGenerator at 0x000001A09379A830> for i in genertor: print(i) >>>0 >>>1 >>>4
在yield關鍵字,這個函式會返回一大批需要只讀取一次的值。為了精通yield,必須理解:當你呼叫這個函式的時候,函式內部的程式碼並不立馬執行,這個函式只是返回一個生成器物件。