python基礎入門 生成器

2022-09-13 23:15:32 字數 2570 閱讀 4267

生成器

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。

而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,

那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?

這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

要建立乙個generator,有很多種方法。第一種方法很簡單,只要把乙個列表生成式的改成(),就建立了乙個generator:

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行

def

fib(max):

n, a, b = 0, 0, 1

while n #print(b)

yield b #

只要有它在,這裡就不是函式了,是乙個生成器了。 把fib函式變成generator了。

a, b = b, a + b #

相當於 t = (b, a + b) t是乙個tuple a = t[0] b = t[1]

n = n + 1

return

'---yyyy----

'f=fib(10)

print(f.__next__())

print(f.__next__())

print(f.__next__())

print(f.__next__())

print("------")

for i in f:

print(i)

我們在迴圈過程中不斷呼叫yield,就會不斷中斷。當然要給迴圈設定乙個條件來退出迴圈,不然就會產生乙個無限數列出來。

同樣的,把函式改成generator後,我們基本上從來不會用next()來獲取下乙個返回值,而是直接使用for迴圈來迭代:

for n in fib(6):

print(n)

但是用for迴圈呼叫generator時,發現拿不到generator的return語句的返回值。

如果想要拿到返回值,必須捕獲stopiteration錯誤,返回值包含在stopiterationvalue中:

def

fib(max):

n, a, b = 0, 0, 1

while n #print(b)

yield b #

只要有它在,這裡就不是函式了,是乙個生成器了。 把fib函式變成generator了。

a, b = b, a + b #

相當於 t = (b, a + b) t是乙個tuple a = t[0] b = t[1]

n = n + 1

return

'---yyyy----

'g= fib(6)

while

true:

try:

x =next(g)

print("g:"

,x)

except

stopiteration as e:

print("

generator return value:

",e.value)

break

最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。

而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行data = fib(print(data)

print(data.__next__

())print(data.__next__

())print("

幹點別的事")

print(data.__next__

())print(data.__next__

())print(data.__next__

())print(data.__next__

())print(data.__next__

())#輸出1

1幹點別的事

235

813

python基礎 生成器

生成器是根據某種演算法得出的一系列元素,需要用到該元素,才會生成出來,比列表節省記憶體空間。生成器相當於儲存演算法,授人以漁,列表之類的是授人以魚。第一種建立生成器的方法 1 gen x 2 for x in range 5 type gen 通過next 函式得到生成器的每個值 next gen ...

python基礎 生成器

生成器函式 def generator print 1 return a ret generator print ret 只要含有yield關鍵字的函式都是生成器函式 yield不能和return共用且需要寫在函式內 def generator print 1 yield a 生成器函式 執行之後會...

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...