為了更好地理解關鍵字yield
的用法,首先需要理解迭代器(iterator)與生成器(generator)的區別。當建立列表中的元素時,我們可以使用for
迴圈:
>>> myiterator = [x*x for x in range(3)]
>>> print(myiterator)
[0, 1, 4]
因此我們稱列表是可迭代的(iterable)。但是基於這種方法逐次訪問列表中的元素時,需要首先將包含所有元素的列表建立並儲存,當元素數量過多時可能造成記憶體空間的利用效率下降。因此考慮只進行一次迭代的生成器,並不在訪問元素之前將所有元素值儲存在記憶體空間,而是在迭代過程中生成要訪問的元素,並且訪問過的元素就不會再儲存在生成器所佔的記憶體空間中。
>>> mygenerator = (x*x for x in range(3))
>>> print(mygenerator)
at 0x000001f67d449518>
>>> for i in mygenerator:
print(i)01
4>>> print(mygenerator)
at 0x000001f67d449518>
>>> for i in mygenerator:
print(i)
>>>
上述**首先建立生成器物件,使用for
迴圈迭代訪問生成器中的每乙個元素時,可以看到進行一次迭代後生成器就變為空。也可以將生成器物件轉換為列表物件,生成器在訪問一次之後變為空就可以更明顯地看出來:
>>> mygenerator = (x*x for x in range(3))
>>> print(mygenerator)
at 0x000001b3a48ded00>
>>> print(list(mygenerator))
[0, 1, 4]
>>> print(list(mygenerator))
而關鍵字yield
的作用類似於return
,但返回的是乙個生成器物件,注意**示例表示返回的生成器的元素為i*i
:
>>> def creategenerator():
for i in range(3):
yield i*i
>>> mygenerator = creategenerator()
>>> print(mygenerator)
>>> for item in mygenerator:
print(item)01
4>>>
>>> def read_dataset(file):
for line in file:
yield [word for word in line.split(" ")]
>>> dataset = ["hello world", "i love china", "are you ok"]
>>> train = read_dataset(dataset)
>>> print(train)
>>> print(list(train))
[['hello', 'world'], ['i', 'love', 'china'], ['are', 'you', 'ok']]
>>> print(list(train))
Python的yield關鍵字
忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。yield關鍵字用來定義生成器 generator 其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行...
Python的yield關鍵字
忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。yield關鍵字用來定義生成器 generator 其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行...
python中yield關鍵字
mylist是乙個可迭代的物件。當你使用乙個列表生成式來建立乙個列表的時候,就建立了乙個可迭代的物件 mylist x x for x in range 3 for i in mylist print i 01 4在這裡,所有的值都存在記憶體當中,所以並不適合大量資料 def creategener...