快速理解python裡的生成器

Python的生成器是個很強大的東西,特別是在python3。0版本以後。以最簡單的方式讓大家快速理解生成器。

1、正常的寫法

來看個例子,比如輸出一個自定義長度的列表一般這麼寫:

快速理解python裡的生成器

這裡傳入的引數時10,所以會得到一個包含10個元素的列表:

快速理解python裡的生成器

那當我傳入的是10W的時候,那生成的這個列表就很大了,也佔記憶體,執行指令碼也佔cpu。

2、改良後寫法

改良一下程式碼,把他寫成一個迭代的類:

快速理解python裡的生成器

這裡面self。b就記錄了每次執行next方法的位置,知道每次是第幾次執行next方法,所以執行保證了每次輸出的是期望的值,其實這就是迭代了,每執行一次函式都被記錄已執行的狀態。當被呼叫的時候才返回值,否則就處於等待被呼叫的狀態

執行結果:

快速理解python裡的生成器

所以這改良後的程式碼就解決了當你輸入10W的時候佔用資源的問題,因為輸入10W後,只要當呼叫next函式的時候才返回值,不是一次返回一個那麼大的列表出來。

3、生成器

那麼第二步中的程式碼跟第一步比起來又太多了感覺,那麼生成器就來了

再改良程式碼:

快速理解python裡的生成器

只需改下第一步中的程式碼a。append(n)為yield n,這既是一個生成器了,然後透過for語句來呼叫生成器的值。這裡就達到了跟第一步中的程式碼同樣的效果,只是這個函式被呼叫時不會去執行裡面的程式碼,透過for語句來逐個輸出裡面的值。

一個是生成器的函式,當你直接呼叫這個函式時,內部的程式碼是不會被執行的,只有呼叫yield裡面的next函式才會去執行程式碼,for迴圈也就是會自動去呼叫這個next函式來輸出值。

可以理解為一個函式被yield中斷了,下載再次呼叫時繼續從上一次中斷的位置繼續執行程式碼並返回值。

講的比較簡單,不知道大家理解了沒有。