Python的yield關鍵字

2021-05-25 15:37:09 字數 1198 閱讀 9491

忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。

yield關鍵字用來定義生成器(generator),其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行。也就是說,yield返回函式,交給呼叫者乙個返回值,然後再「瞬移」回去,讓函式繼續執行, 直到嚇一跳yield語句再返回乙個新的值。

使用yield返回後,呼叫者實際得到的是乙個迭代器物件,迭代器的值就是返回值,而呼叫該迭代器的next()方法會導致該函式恢復yield語句的執行環境繼續往下跑,直到遇到下乙個yield為止,如果遇不到yield,就會丟擲異常表示迭代結束。

看乙個例子:

>>> def test_yield():

...     yield 1

...     yield 2

...     yield (1,2)

...>>> a = test_yield()

>>> a.next()

1>>> a.next()

2>>> a.next()

(1, 2)

>>> a.next()

traceback (most recent call last):

file "", line 1, in ?

stopiteration

每次呼叫a.next(),都會得到下乙個yield返回的值,最後一次呼叫會丟擲stopiteration結束異常。

暫時沒想到這個東西有什麼用,也許就是可以省一些**。

乙個有趣的例子,用來生成乙個序列的全排列:

defperm(

items, n=none

ifn is

none

n = len

items)

fori in

range

lenitems)

v = items[

i:i+1]

ifn == 1:

yield

velse

rest = items[

:i]+ items[

i+1:]

forp in

perm(

rest, n-1)

yield

v + p

的確是方便一些,不過我還是覺得都放到乙個陣列裡更直觀...

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 用同步方式寫非同步 生成器 可迭代的函式...