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