經過列表list生成器,咱們能夠直接建立一個列表python
>>> x = list(range(1,11)) >>> x [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可是,受到內存的限制,列表的容量是有限的,並且建立一個包含100萬1個億的列表時候,不只會佔用很大的儲存空間,若是有事咱們只要訪問前面幾個元素,那後面大多數元素都白白浪費了。並且運做效率低下。
若是列表元素能夠按某種算法推算出來,那咱們是否能夠在循環的過程當中不斷推算出後面的元素呢?這樣就沒必要要建立一個完整的list列表了,從而提高程序的效率。在python中,這種一邊循環一邊計算的機制,稱爲生成器generator算法
要建立一個generator,有不少方法:shell
第一種方法很簡單,就是隻要把一個列表生成試的 [ ] 改爲 ( ) 就能夠建立一個generator:函數
>>> l = [x * x for x in range(10)] >>> l [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x00000000035BC410>
L 是一個list, 而 G 是一個generator:它們在建立時候最基本的不一樣就list是 [ ] ,而generator是 ( ) 。對象
咱們能夠直接打印出list的所有元素,可是怎麼打印出generator的所有元素呢?blog
>>> g <generator object <genexpr> at 0x00000000035BC410>
若是要一個個打印出來,能夠經過next()函數來得到generator的下一個返回值。內存
>>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> next(g) StopIteration
generator保存的是算法,每次調用 next(g)的時候纔會計算 g 的下一個元素值,直到計算到最後一個元素,沒有下一個元素時,會返回stopIteration的錯誤。generator
固然,上面這種不停調用next (g)這種方法實在是太繁瑣了,正確的方法是使用for循環,由於generator也是一個可迭代對象:io
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64 81
咱們建立一個generator以後,基本上不會調用next(),而是經過for循環來迭代他,而且不用關心StopIteration的錯誤for循環
generator很是強大,若是推算的算法比較複雜,用相似列表生成試的for循環沒法實現的時候,我還能夠用函數來實現。