python 生成器&迭代器

1.什么是生成器:  

     通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

 1 #创建生成器方法1
 2 #要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生推导式的 [ ] 改成 ( )
 3 
 4 In [19]: list1 = [x*2 for x in range(5)]
 5 
 6 In [20]: list1
 7 Out[20]: [0, 2, 4, 6, 8]
 8 
 9 In [21]: generator=(x*2 for x in range(5))
10 
11 In [22]: generator
12 Out[22]: <generator object <genexpr> at 0x2f47910>
13 
14 #创建 list1和 generator 的区别仅在于最外层的 [ ] 和 ( ) , list1 是一个列表,而 generator 是一个生成器。我们可以直接打印出list1的每一个元素,但我们怎么打印出genertor的每一个元素呢?如果要一个一个打印出来,可以通过 next() 函数获得生成器的下一个返回值:当生成器的最后一个元素被取完之后会抛出一个异常,StopIteration: 
15 In [23]: next(generator)
16 Out[23]: 0
17 
18 In [24]: next(generator)
19 Out[24]: 2
20 
21 In [25]: next(generator)
22 Out[25]: 4
23 
24 In [26]: next(generator)
25 Out[26]: 6
26 
27 In [27]: next(generator)
28 Out[27]: 8
29 
30 In [28]: next(generator)
31 ---------------------------------------------------------------------------
32 StopIteration                             Traceback (most recent call last)
33 <ipython-input-28-1d0a8ea12077> in <module>()
34 ----> 1 next(generator)
35 
36 StopIteration: 
37 
38 此时也可以借助for 循环进行取generator的元素,并且不需要关心 StopIteration 异常
39 In [39]: generator=(x*2 for x in range(5))
40 
41 In [40]: for item in generator:
42     print item
43    ....:     
44 0
45 2
46 4
47 6
48 8

 

  

posted @ 2017-10-24 16:37  lichenxi  阅读(170)  评论(0编辑  收藏  举报