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