天天看點

從簡單的案例搞懂python中的yield你應該知道帶有yield關鍵字的函數不再是一個簡單的函數,而是一個生成器generator,那啥叫生成器呢?生成器yield關鍵字

你應該知道帶有yield關鍵字的函數不再是一個簡單的函數,而是一個生成器generator,那啥叫生成器呢?

生成器

簡單說生成器就是疊代器,相應的它也是可以疊代的對象,但是它實作了一邊循環,一邊進行計算的這種機制。

案例1.清單推導式:

li=[i for i in range(10)]
           

上述清單推導式實作了一個[0,1,2,3,4,5,6,7,8,9]這樣一個清單,但是這個清單是一次性生成所有元素,然後存儲在記憶體中的,假如range中我填入1百萬或者1千萬的資料呢,記憶體是有限制的,這樣生成這麼多的資料,可能就撐爆你的記憶體了,并且你可能隻通路很少的一些資料,這就大大浪費了你的記憶體。此時生成器的優點就展現出來了:生成器不會一次性生成能容納所有的資料的清單,即它不會建立完整的清單,這就大大減少了記憶體的占用。

yield關鍵字

下列代碼定義了一個函數f,for循環周遊,使用yield傳回i,yield後面的代碼是為了測試,

def f():
    for i in range(5):
        yield i

        print('我是yield之後的代碼')
        print()


res=f()
for i in res: #對生成器對象進行周遊
    print(i)
           

我使用的是打斷點進行調試,下面将一一證明:

1.帶了yield關鍵字的函數是一個生成器,并且調用函數f()并不會執行函數裡面的代碼,而是先得到了一個生成器對象,隻有周遊時,才會執行。

2.每次函數f()執行到yield處就會停止,下次從yield停止的地方繼續執行,即可以記住函數代碼執行的位置。

(1))帶了yield關鍵字的函數是一個生成器: 在函數調用處打斷點,可以看到得到的是一個生成器對象

從簡單的案例搞懂python中的yield你應該知道帶有yield關鍵字的函數不再是一個簡單的函數,而是一個生成器generator,那啥叫生成器呢?生成器yield關鍵字

(2)在yield及之後的代碼進行打斷點,檢視執行的順序:每次函數f()執行到yield處就會停止,下次從yield停止的地方繼續執行,即可以記住函數代碼執行的位置。

從簡單的案例搞懂python中的yield你應該知道帶有yield關鍵字的函數不再是一個簡單的函數,而是一個生成器generator,那啥叫生成器呢?生成器yield關鍵字

 錄制的GIF動圖:

從簡單的案例搞懂python中的yield你應該知道帶有yield關鍵字的函數不再是一個簡單的函數,而是一個生成器generator,那啥叫生成器呢?生成器yield關鍵字

繼續閱讀