Python個人學(xué)習(xí)筆記 生成器與迭代器
迭代器
迭代器為可迭代對象,可以生成一系列值。等要用的時候才會把值取出來,比起列表更省空間。
可以生成迭代器的函數(shù):iter()、zip()、map()、reversed()、itertools庫里的各種函數(shù)等。


生成器
用來生成迭代器的函數(shù)。

迭代器甚至可以是無限的。


獲取迭代器里的元素
①迭代器作為可迭代對象,可以用for循環(huán)遍歷輸出。

②也可以用next()函數(shù)一個一個取迭代器中的元素,
? ?或者自帶的__next__()方法。


③將迭代器轉(zhuǎn)換為列表等。

④如果只想要某個元素或者某段切片,可以用islice()函數(shù)。
? ?第一個參數(shù)為迭代器,后面的參數(shù)同range()函數(shù)的參數(shù)。


迭代器的性質(zhì)
迭代器具有狀態(tài)信息。到達(dá)序列末尾時迭代器耗盡。(一次性)
迭代器經(jīng)常配合in / not in?判斷某元素是否在迭代器內(nèi)。

用in判斷時,python會從第一個元素遍歷可迭代對象直至找到或者到末尾。
第二次判斷13是否在迭代器中時,由于已經(jīng)遍歷取出了31之前的數(shù),所以已經(jīng)不在迭代器中了,返回False,因為迭代器的每個元素是一次性的。
當(dāng)想多次使用迭代器時,可以用tee()函數(shù)把迭代器拆分成互相獨立的多個迭代器。
第二個參數(shù)為拆分的數(shù)量,不寫時默認(rèn)為2。
▲tee()函數(shù)會緩存原始可迭代對象中的元素,如果原始可迭代對象很大或者無限的,那么使用tee()函數(shù)可能會消耗大量的內(nèi)存。

但是當(dāng)原迭代器被取出元素時,會影響到拆分出來的迭代器。

神奇的是,子迭代器雖然相互獨立,但會影響原迭代器。影響到了原迭代器,另一個子迭代器就會受影響。
可以看到原迭代器取出的元素子迭代器也同時被取出。所以拆分后不要用原迭代器為好。


對比列表和迭代器的內(nèi)存消耗



把迭代器所有元素存到列表里內(nèi)存消耗上升3倍。
(當(dāng)然正規(guī)做法是回溯算法)