yield關鍵字在python中的作用

2021-08-24 20:20:41 字數 1623 閱讀 9808

想要理解yield的作用,你必須先理解什麼是生成器以及從生成器到迭代器的過程。

當你建立乙個list,你可以乙個乙個地讀取他的元素,乙個乙個地讀取元素就叫迭代。

>>> mylist = [1, 2, 3]

>>> for i in mylist:

... print(i)12

3

mylist是乙個迭代器,當你用乙個list推導式,你創造了乙個list,也就是乙個迭代器。

>>> mylist = [x*x for x in range(3)]

>>> for i in mylist:

... print(i)01

4

只要你能使用「for ..in...」結構,那麼它就是乙個迭代器,例如:lists,strings,files

這些迭代器很方便,因為你能根據你的需要讀取他們,但是所有的值都存放在記憶體,當值很多時你可能並不希望這麼做。

生成器也是迭代器,一種你只能迭代一次的迭代器。生成器並沒有把所有值存放在記憶體中,它在執行時才生產值。

>>> mygenerator = (x*x for x in range(3))

>>> for i in mygenerator:

... print(i)01

4

它和迭代器唯一的不同是使用()而不是,但是只不能使用for i in mygenerator 第二次,因為生成器只能使用一次,它先計算出0,然後忘記這個值,計算出1,最後計算出4,乙個接著乙個。

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)01

4

這是乙個使用的例子,當你要返回乙個數量很大的集合並且只會讀取一次時是很方便的。

要想掌握yield,你必須理解當你呼叫函式時,你在函式體中定義的**並不會執行,函式只會返回乙個生成器物件,這看上去有點詭異。

你定義在函式體中的**會在每次for使用生成器時執行

現在來看比較難的部分:

當第一次for呼叫你函式生成的生成器物件時,它會執行你的函式從開始到yield關鍵字,然後返回第一次迴圈的結果。接下來的每次呼叫都會再一次執行你在函式中定義的迴圈,並且返回下乙個值,知道沒有值可以返回。(第一次執行全部函式體,後面每次都只執行迴圈體)

如果函式執行後生成器返回值是空,那可能是迴圈已經結束或者不滿足if/else條件。

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...

python 理解關鍵字 yield

為了方便追 更新擼了乙個基於scrapy的爬蟲。在實現過程中使用到了yield,網上對其的文字描述都很難讓人理解。通過debug 才了解呼叫順序,進而理解了它使用方法。我們可以用乙個等式來形容其作用 yeild 函式 return 生成器 generator 用同步方式寫非同步 生成器 可迭代的函式...