要了解yield的作用,您必須了解生成器是什麼。在了解生成器之前,必須先了解疊代器。
疊代器
當您建立一個清單時,您可以逐個讀取它的項。逐項讀取其項稱為疊代:
>>> mylist = [1, 2, 3]
>>> for i in mylist:
... print(i)
1
2
3
mylist是一個可疊代的對象。當你使用清單解析式時,你建立了一個清單,是以也是一個疊代器:
>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
... print(i)
1
4
所有你可以用"for... in ...."都是疊代器,包括清單、字元串、檔案…等等。
這些疊代器非常友善,因為您可以随心所欲地讀取它們,但是您将所有的值都存儲在記憶體中,當您有很多值時,這就非常浪費記憶體了。
生成器
生成器是疊代器,這種疊代器隻能疊代一次。生成器不會将所有值都存儲在記憶體中,它們會動态生成這些值:
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i)
1
4
它和清單解析式是類似的,隻是用()代替了[]。但是,您不能在mygenerator中對i執行第二次,因為生成器隻能使用一次:它print(0),然後忘記它,print(1),最後是4。
Yield
yield是一個與return類似的關鍵字,隻是函數将傳回一個生成器。
>>> def createGenerator():
... mylist = range(3)
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
>>> for i in mygenerator:
... print(i)
1
4
您需要知道的是函數将傳回一組隻需要讀取一次的值,将這個特性了解清楚,用對地方将極大地提高性能,下次我們将介紹在什麼時候該用它。
要掌握yield,您必須了解,在調用函數時,在函數體中編寫的代碼不會運作。函數隻傳回生成器對象,這有點棘手:-)
然後,您的代碼将從每次使用生成器時停止的地方繼續。
現在是最難的部分:
for函數第一次調用從函數建立的生成器對象時,它将從頭運作函數中的代碼,直到達到yield,然後傳回循環的第一個值。然後,彼此調用将再次運作您在函數中編寫的循環,并傳回下一個值,直到沒有要傳回的值為止,就如我們上面的例子所示。
我們的文章到此就結束啦,如果你希望我們今天的Python 教程,請持續關注我們,如果對你有幫助,麻煩在下面點一個贊/在看哦,有任何問題都可以在下方留言區留言,我們都會耐心解答的!
Python實用寶典 (pythondict.com)
不隻是一個寶典
歡迎關注公衆号:Python實用寶典 原文來自Python實用寶典:Python Yield關鍵詞的作用