1. 程式人生 > >關於Python中的 yield

關於Python中的 yield

今天研究一下 python 中的 yield。

首先要明白的是 generator 叫做“迭代器”,是可以用在 for 迴圈中的,包括 生成器 和 帶有 yield 表示式的 generator function.

              這裡yield 有兩個優點:

                               1. 不會把所有資料取出來放進記憶體裡,而是返回一個物件,用多少取多少,節省記憶體空間。

                               2. 從上一次中斷的地方繼續,不會結束迴圈。

                        這裡可以想一下你做爬蟲的那個 work_list[],實際上是非常大的,直接用for迴圈去訪問沒有用yield訪問來的科學。

1. yield

yield英文意思是“生產” / "屈服"。其實加了 yield的函式就是一個generator。next() 函式可以讓generator 執行。

這裡看一個例子。

可以看到直接呼叫這個 test() 函式,函式並沒有執行,而是返回了一個 generator 的物件,因為函式裡面有yield表示式。通過next() 函式可以恢復 generator 執行,直到下一個yield 。

可以看到,第一個 next(),函式執行到第一個yield。第二個 next() ,尋找下一個yield,最後沒有yield,會報異常。 

next() 和 send(None)

在 generator 這裡,next() 和 send(None) 的作用是一樣的。

next(c) 就相當於 c.send(None) 。 看一個例子

這裡主要看一下。首先每次 next() 都把 generator 推向下一個 yield。 send() 函式如果含引數的話,就會替換 yield 表示式。從而輸出。

使用 generator

在之前的雲圖指令碼中,我們使用 jieba.cut() 方法返回的物件就是一個 gene。只需要用迴圈去訪問即可。

其實我們在 genertaror 中,基本從來都不會用到 next() 函式去寫,上面寫的東西只是給你理解 generator 這個東西。

下面看一個實際應用的例子

實際上對於 generator 在 for 迴圈中的呼叫,應該是一直在內部呼叫 next() 直到丟擲異常。