python 生成器与迭代器

什么是生成器?   

生成器(generator)就是 python 中一种一边循环一边计算的机制

生成器有什么作用?

比如当我们生成一个列表,我们可以通过列表式直接创建一个列表。但是受到内存的限制,列表的容量肯定是有限的。而且创建一个非常大的列表时消耗的内存也是非常大的。如果我们仅仅需要访问前面几个元素,那么后面绝大多数占用的空间都浪费了。而生成器可以帮助我们不必创建完整的列表,在需要时通过循环来创建出后面的元素,节省大量的空间。

生成器创建的方法:

要创建生成器有很多种方法。第一种方法很简单,只要把一个列表的【】改成()

 

1 L =[x for x in range(5)] 
2 
3 G =(x for x in range(5))

 

分别输出 L 和 G 得出以下结果:

L:[0,1,2,3,4]

G:<generator object <genexpr> at 0x02101C90>

可以发现 G 是一个生成器对象;如果想要打印出来可以通过 next() 函数获得生成器的下一个返回值:

next(G)                               # 执行此操作会打印出 0

next(G)                               # 执行此操作会打印出 1

……

next(G)                               # 执行此操作会打印出 5

 

在没有元素时,,在使用 next 会抛出一个 stoplteration 异常。

创建生成器方法2:

1 def lister(times):
2     n = 0
3     while n < times:
4         yield n
5         n += 1
6 
7 for x in lister(5):
8     print(x)

 

yield 函数可以将整个函数转换成生成器

上面的代码执行时会不断调用 yield ,就会不断中断产生一个数值,记录下来,此时 lister(5) 便是一个 generator 对象。当然也可以采用 next 函数逐次输出。

对于 yield 转换的函数可以使用 send 来进行传值达到控制的目的:

         如 g =  lister()

              g.send(6)

 

迭代:

         迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。

可迭代对像(Iterable):

        可被循环的都是可被迭代的,统称为可迭代对像。

可迭代对像的判断:

        可以使用 isinstance() 判断一个对象是否是 Iterable 对像:

         用法: isinstance(obj,class)

         如:     

1 from collections import Iterable
2 
3 isinstance ([ ], Iterable)
4 
5 ##返回值为 True

迭代器(Iterator):

        生成器都是 Iterator 对像,但 list ,dict, str,tuple等类型虽然都是 Iterable 却不是 Iterator;

        生成器的值的对像被称为迭代器

        迭代器对像从集合的第一个元素开始访问,直到所有元素被访问完结束。迭代器只能往前不会后退。

        可以使用 isinstance() 判断一个对象是否是 Iterable 对像:

        用法: isinstance(obj,class)

        如:    

1  from collections import Iterator
2 
3 isinstance ([ ], Iterator)
4 
5 #返回值为False

迭代器的转换:

        对于非迭代器的可迭代对像可以使用 iter() 函数将 Iterable 转化为 Iterator。

迭代器的目的:

         减少内存的占用

posted @ 2017-09-06 21:17  何惜戈  阅读(228)  评论(0编辑  收藏  举报