Python 關鍵字 yield 的理解

2021-08-30 06:37:44 字數 1800 閱讀 7190

為了更好地理解關鍵字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...