1. 程式人生 > >python3 語法小記(三) 關鍵字yield

python3 語法小記(三) 關鍵字yield

為了理解什麼是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,必須理解:當你呼叫這個函式的時候,函式內部的程式碼並不立馬執行,這個函式只是返回一個生成器物件。