前面我們談到,利用列表推導來代替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)
外圍的迭代器每次向前推進時,會推動內部的迭代器向前更新,串在一起的生成器表達式在執行速度上是很快的。