Python生成器是創建迭代器的簡單方法。
簡單來說,生成器是一個函數,它返回一個我們可以迭代的對象(迭代器),迭代器一次返回一個值
較使用列表將所有數據都加載到內存中,生成器節省了大量內存空間。
深度學習的數據讀取部分一般都需要使用迭代器。
創建生成器
生成器有兩種創建方式:
列表生成式的 [] 改成 ()
使用yield方法
1 列表生成式的 [] 改成 ()
把列表生成式中的 [] 改成 () 就創建了一個generator
>>> L = [x * x for x in range(10)]
>>> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g<generator object <genexpr> at 0x1022ef630>
創建L和g的區別僅在於最外層的 [] 和 () ,L是一個list,而g是一個generator。
2 使用yield方法
生成器解釋:
1,yield:用於返回數據,程序執行到 yield 後,返回結果,記住當前狀態,暫停執行,下次調用時,根據上次的狀態,返回下一個結果,記住新的狀態,暫停執行,……
簡單來說,就是調用一次,吐出 1 個數據,再調用一次,吐出第 2 個數據,再調用一次,吐出第 3 個 ……,在模型訓練時,每個批次的數據,就是通過 yield 吐出來的;
2,生成器可以通過 next 函數調用來一一吐出數據,也可以調用自身的__next__函數;
3,生成器是一種特殊的迭代器,可以通過 for 循環來遍歷其中的數據;
# 定義生成器函數def my_gen():--my_list = ['I', 'love', 'python', 123]--for item in my_list:----yield item# 獲取生成器gen1 = my_gen()# 獲取生成器中的數據print(gen1.__next__()) # Iprint(next(gen1)) # love# 定義生成器,並遍歷其數據gen2 = my_gen()for item in gen2:--print(item)
3 函數內部定義生成器
外部定義一個函數,內部定義一個生成器函數,外部函數返回這個生成器函數的名稱
def outer_fn(num=10):--def inner_gen(para=num):----for item in range(para + 1):-yield item ** 2----return inner_geninner_fn = outer_fn(5) # 外部函數執行,返回內部函數gen = inner_fn() # 內部函數執行,返回生成器print(next(gen)) # 0print(next(gen))#1