前面我們談到,利用列表推導來代替map
和filter
,但是當資料量比較大時,使用列表推導需要把資料全部載入到記憶體當中,會消耗大量記憶體,導致程式崩潰。
下面讀取檔案中的資料,此種方式只適合檔案小的情況下,當檔案較大時,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...