了解生成器
我們知道迭代器有兩種:一種是呼叫方法直接放回的;一種是可迭代物件執行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...