第9條 用生成器表示式改寫資料量比較大的列表推導

2021-10-03 03:16:24 字數 1275 閱讀 7712

前面我們談到,利用列表推導來代替mapfilter,但是當資料量比較大時,使用列表推導需要把資料全部載入到記憶體當中,會消耗大量記憶體,導致程式崩潰。

下面讀取檔案中的資料,此種方式只適合檔案小的情況下,當檔案較大時,open()操作返回的檔案物件會儲存在記憶體中,再使用列表推導取出資料。

value =

[x for x in

open

('./test.txt')]

print

(value)

1.生成器表示式

為了解決此類問題python提供了生成器表示式(generator expression),它是對列表推導和生成器的一種泛化。

生成器表示式在執行的過程中並不會把整個輸出序列都求出來,而是會產生乙個迭代器,每次依據上一次的結果產生新的資料,直到資料遍歷結束。

把實現列表推導的那段表示式放在一對括號內,就構成了生成器表示式。對生成器表示式求值的時候,會返回乙個迭代器,而不會深入處理檔案的內容。

注意 生成器表示式所返回的迭代器是有狀態的,每次呼叫完next後,就不能返回到先前的狀態,不能反覆使用

it = (len

(x)for x in

open

('./test.txt)

))#返回迭代器

print

(it)

通過呼叫內建的next函式,即可使其按照生成器表示式來輸出乙個值。多次呼叫next便會使得迭代器不斷推進。

print

(next

(it)

)print

(next

(it)

))

2. 生成器表示式組合

把某個生成器表示式所返回的迭代器,放在另外乙個生成器表示式的for子表示式中,可以產生連鎖反映。

roots =

((x,x**

0.5)

for x in it)

外圍的迭代器每次向前推進時,會推動內部的迭代器向前更新,串在一起的生成器表示式在執行速度上是很快的。

生成器表示式

生成器 生成器本質是迭代器,允許自定義邏輯的迭代器 迭代器和生成器區別 迭代器本身是系統內建的.重寫不了.而生成器是使用者自定義的,可以重寫迭代邏輯 生成器可以用兩種方式建立 1 生成器表示式 裡面是推導式,外面用圓括號 2 生成器函式 用def定義,裡面含有yield 1 生成器表示式 gener...

生成器 表示式

1.什麼是生成器?生成的工具。生成器是乙個 自定義 的迭代器,本質上是乙個迭代器。2.如何實現生成器但凡在函式內部定義了的yield,呼叫函式時,函式體 不會執行,會返回乙個結果,該結果就是乙個生成器。yield 每一次yield都會往生成器物件中新增乙個值。yield只能在函式內部定義 yield...

生成器表示式

把列表推導式的換成 就是生成器表示式 示例 把生一筐雞蛋變成給你乙隻老母雞,這也是生成器的特性 chicken 雞蛋 s item for item in range 10 print chicken 生成器物件記憶體位址 print next chicken 雞蛋0 print next chic...