一分鐘了解Python生成器
什么是生成器
當我們討論生成器的時間一般會涉及兩個方面
生成器函數 :生成器函數類似正常的函數,但是當它需要返回值的時候使用 yield 來代替 return。如果一個函數包含 yield,那么就可以說這個函數是生成器函數。
def gen_fun():
??yield 'a'
??yield 'b'
for item in gen_fun():
??print(item)
執行以上代碼,輸出:
a
b
生成器對象 :生成器函數返回的就是生成器對象,通過調用生成器對象的 next() 方法(Python3 為 __next__() 或內置的 next 函數)或 for in 語法來使用生成器對象。
def gen_func():
??yield 'a'
??yield 'b'
# 這里的 g 就是一個生成器對象
g = gen_func()
# 通過 for in 來去除生成的數據
for item in g:
??print(item)
執行以上代碼,輸出:
a
b
生成器有什么特點
同樣是可以用 for in 來遍歷對比直接返回 ['a', 'b'] 的正常函數,它具有以下特殊之處:
它并沒有把所有生成的值存在內存中,而是在運行時生成值。
它返回的生成器對象僅可遍歷一次,例如上述例子中再次使用 for item in g 遍歷時會發現什么沒輸出。
生成器的應用場景
生成器運行時生成值時的特性可以避免一次性創建大量的對象占有過多的內存,它能夠讓你在許多情況下以一種優雅而又更低內存消耗的方式簡化 無限 序列相關的操作。實際場景中當需要大量生成數據的時候都是考慮讓生成器登場的時候。
以下是一個經典的實現斐波那契數列生成器的例子:
def fib(n):
??a, b = 0, 1
??for item in range(n):
????yield b
????a, b = b, a + b
for item in fib(5):
??print(item)
執行以上代碼,輸出:
1
1
2
3
5
聲明:文章來源于網絡,如有侵權請聯系刪除!