1. 程式人生 > >Python 三大器之生成器

Python 三大器之生成器

生成器-generator

問題: 如果一次性將列表中的所有元素都載入到列表中, 佔用記憶體, 影響效能…
解決: 生成器可以邊使用邊計算下一個元素, 不用將所有的元素都載入進來

注意:
獲取生成器裡的元素, 通過使用next函式就可以不斷的獲取下一個元素
如果當前已經是最後一個元素, 繼續next程式會出錯 , StopIteration
在for迴圈中遍歷生成器的時候,當已經獲取到最後一個元素時,會自動跳出,不會報錯
return, break, 也會終止

#普通列表生成
numbers=[] 
for i in range(0,101): 
  numbers.append(i) 
print(numbers) 

#列表生成式
numbers=[i for i in range(0,101)] 
print(numbers)

#生成器(generator)
numbers=(i for i in range(0,101))
print(numbers)
print(type(numbers))
print(next(numbers))

生成器執行結果如下:
生成器執行結果

生成器是一種特殊的迭代器,它的返回值不是通過return而是用yield。 生成器一定是迭代器(反之不成立),因此任何生成器也是一種懶載入的模式生成值。用生成器來實現斐波那契數列的例子是:

def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev
f = fib()
print(f)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

在這裡插入圖片描述

generator和函式的執行流程不一樣:
函式是順序執行,遇到return語句或者函式執行完畢就返回,再次執行重新呼叫,
而generator,在每次呼叫next()的時候執行,遇到yield語句返回,
再次執行時從上次返回的yield語句處繼續執行(從哪裡跌倒,就從哪裡爬起來)。