愛伊米

學會 Python yield 關鍵詞,此文就夠了

要理解yield的作用,你必須理解生成器是什麼。在理解生成器之前,必須先理解迭代器。

1.迭代器

當您建立一個列表時,你可以逐個讀取它的項。逐項讀取其項稱為迭代:

學會 Python yield 關鍵詞,此文就夠了

mylist是一個可迭代的物件。當你使用列表解析式時,你建立了一個列表,因此也是一個迭代器:

學會 Python yield 關鍵詞,此文就夠了

所有你可以用“for。。。 in 。。。。”都是迭代器,包括列表、字串、檔案…等等。

這些迭代器非常方便,因為你可以隨心所欲地讀取它們,但是你將所有的值都儲存在記憶體中,當你有很多值時,這就非常浪費記憶體了。

為了解決這樣的問題,Python有了

生成器

的概念。

2.生成器

生成器是迭代器,這種迭代器只能迭代一次。生成器不會將所有值都儲存在記憶體中,它們會動態生成這些值:

學會 Python yield 關鍵詞,此文就夠了

它和列表解析式是類似的,只是用()代替了[]。但是,你不能在mygenerator中對i執行第二次,因為生成器只能使用一次:它print(0),然後忘記它,print(1),最後是4。

3.Yield

yield是一個與return類似的關鍵字,只是函式將返回一個

生成器

認真看完下面這個例子,你應該能完全明白。

學會 Python yield 關鍵詞,此文就夠了

函式將返回一組只需要讀取一次的值。如果你能將這個特性理解清楚,並將其應用到你的程式碼中,可能可以極大地提高效能,下次我們將介紹在什麼時候該用它。

請注意示例中的第6行,在呼叫函式時,在函式體中編寫的程式碼不會執行。函式只返回生成器物件,可別忘了這個重點。

最後,你的程式碼將從每次使用生成器時停止的地方繼續。因此示例中第二次使用生成器的時候,我們的生成器已經完全沒有值了。

所以最核心的邏輯如下:

1。 for函式第一次呼叫從函式建立的生成器物件時,它將從頭執行函式中的程式碼,直到達到yield,返回迴圈的第一個值。

2。 隨後的呼叫都將再次執行你在函式中編寫的迴圈,並yield返回下一個值,直到沒有要返回的值為止,就如我們上面的例子所示。

如果你喜歡我們今天的Python 教程,請持續關注我們,如果對你有幫助,麻煩在下面點一個贊/在看,記得給個三連哦!