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