python 生成器generator

经过列表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循环没法实现的时候,我还能够用函数来实现。

相关文章
相关标签/搜索