所屬網站分類: python基礎 > 語句 作者:goodbody 鏈接: http://www.pythonheidong.com/blog/article/10/ 來源:python黑洞網 www.pythonheidong.com 要瞭解yield它的作用,您必須瞭解生成器是什麼 迭代器 創建 ...
所屬網站分類: python基礎 > 語句
作者:goodbody
鏈接: http://www.pythonheidong.com/blog/article/10/
來源:python黑洞網 www.pythonheidong.com
要瞭解yield它的作用,您必須瞭解生成器是什麼
迭代器
創建列表時,您可以逐個取出元素。逐個讀取它的項稱為迭代。
>>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3
當您使用列表推導時,您創建一個列表,因此是一個可迭代的:
>>> mylist = [x*x for x in range(3)] >>> for i in mylist: ... print(i) 0 1 4
在python中你可以使用的所有都是可迭代的; lists,strings,文件...等等
這些迭代很方便,因為您可以根據需要讀取它們,但是您將所有值存儲在記憶體中,當您擁有大量值時,這並不總是您想要的。
生成器
生成器是迭代器,是一種只能迭代一次的迭代器。生成器不會將所有值存儲在記憶體中,它們會動態生成值:
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4它和迭代器產生的值是相同的,除了你用()而不是[]。但是,由於生成器只能使用一次,所以不能再執行for i in mygenerator:它們計算0,然後列印它並計算1,然後逐個計算4。
yield
yield相當於return,但跟return又有所不同
>>> def createGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i*i ... >>> mygenerator = createGenerator() # create a generator >>> print(mygenerator) # mygenerator is an object! <generator object createGenerator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 4
你的函數將返回一組你只需要使用一次的大量值時使用yield它會很方便。
要掌握yield,您必須明白,當您調用該函數時,您在函數體中編寫的代碼不會運行。該函數只返回生成器對象)
然後,您的代碼將從每次for使用生成器時停止的位置繼續。
第一次for調用從函數創建的生成器對象時,它將從開始運行函數中的代碼直到它遇到yield,然後它將返回迴圈的第一個值。然後,每個其他調用將再次運行您在函數中寫入的迴圈,並返回下一個值,直到沒有值返回。
函數不再被yield,這可能是因為迴圈已經結束,或者因為你不再滿足"if/else"了。