Python成長之路 生成器

2021-09-16 13:54:51 字數 1398 閱讀 5026

了解生成器

我們知道迭代器有兩種:一種是呼叫方法直接放回的;一種是可迭代物件執行iter方法得到的。迭代器的有點是可以節省記憶體。

如果在某些情況下,我們也需要節省記憶體,就只能是自己寫,我們自己寫的這個能實現迭代器功能的東西就叫做生成器。

生成器的函式:常規函式定義,但是,使用的是yield語句而不是return語句返回結果,yield語句一次返回乙個結果,在每個結果中間,掛起函式狀態,以便在下次從它離開的地方繼續執行,返回結果。

生成器的表示式:類似於列表推導,但是返回的是乙個按需產生的乙個物件,而不是乙個結果列表。

本質:迭代器

特點:惰性運算,開發者自定義

生成器函式

乙個包含yield關鍵字的函式就是生成器函式,yield可以為我們從函式中返回值,但是yield不同於return,return的執行意味著程式的結束。呼叫生成器函式不會得到返回具體的值,而是得到乙個迭代物件,每一次獲取這個可迭代物件的值,就能夠推動函式的執行,獲取新的函式值,知道函式執行結束。

def genrator_func()

: x =

1print

("定義了乙個變數x"

)yield x

y =2print

("定義了乙個變數y"

)yield y

ret =

genrator_func()

print

(ret)

//for i in ret:

print

(i)

從執行的結果來看,直接列印執行生成器返回的結果是乙個 genrator

那麼生成器有什麼優點呢?就是在記憶體中不會產生太多的資料,當yield進行了返回,執行下乙個yield時,那麼前面乙個yield的值就會從記憶體中進行清除,總之,就是需要值的時候就會從生成器中去獲取

這裡舉個例子:假如我要一批零件,需要找工廠進行加工,需要20000000個,跟工廠溝通好了之後工程再去生產,我可以乙個乙個的要,可以一批一批的要,而不是說我要20000000個,工廠就先將20000000個先加工好,然後在一次性去取回來

def production()

:for i in

range

(20000000):

yield

"加工的第 %s 個零件"

%iret =

production()

print

(ret.

__next__()

)//可以乙個乙個的取

print

(ret.

__next__()

)for x in ret:

print

(x)

生成器的應用

小結

python之路 生成器

顧名思義,列表生成式就是通過某種方式來生成乙個列表,那麼 ok,我們可以通過哪幾種方式來生成呢?from collections import iterable list 1 0,1,2,3,4,5,6,7,8,9 defadd x return x 2 result map add,list 1 ...

python之路 再談生成器

對於普通的生成器,第乙個next呼叫,相當於啟動生成器,會從生成器函式的第一行 開始執行,直到第一次執行完yield語句 第4行 後,跳出生成器函式。然後第二個next呼叫,進入生成器函式後,從yield語句的下一句語句 第5行 開始執行,然後重新執行到yield語句,執行後,跳出生成器函式,後面再...

python之路 函式迭代,生成器

恢復內容開始 dir 被測物件 如果它含有 iter 那這個物件叫做可迭代物件,遵循可迭代協議。可迭代物件 iterable 可以轉換 迭代器 如何實現 都像內部定義乙個 iter 方法 迭代器 iterator 遵循迭代器協議 1,只含有 iter 方法的資料是課迭代的物件 l 1,2,3,4 p...