码迷,mamicode.com
首页 > 编程语言 > 详细

Python迭代器和生成器介绍

时间:2015-04-20 15:08:57      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

Python迭代器和生成器介绍

迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。


在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。


常用的几个内建数据结构tuple、list、set、dict都支持迭代器,字符串也可以使用迭代操作。

你也可以自己实现一个迭代器,如上所述,只需要在类的__iter__方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即可。但是需要自己实现迭代器的时候不多,即使需要,使用生成器会更轻松。

[python] view plaincopy

  1. #!/usr/bin/env python  

  2.   

  3. # coding=utf-8  

  4. class test:  

  5.   

  6.     def __init__(self, input_list):  

  7.   

  8.         self.list = input_list  

  9.   

  10.         self.i = 0  

  11.     def __iter__(self):  

  12.   

  13.         return self  

  14.   

  15.       

  16.   

  17.     def next(self):  

  18.   

  19.         if self.i == len(self.list):  

  20.   

  21.             self.i = 0  

  22.   

  23.             raise StopIteration  

  24.   

  25.         self.i += 1  

  26.   

  27.         return  self.list[self.i - 1]  





使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

例如:

[python] view plaincopy

  1. /* 把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 */  

  2.   

  3. for line in open("test.txt").readlines():  

  4.   

  5.     print line  

  6. /* 这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行 */  

  7.   

  8. for line in open("test.txt"):   #use file iterators  

  9.   

  10.     print line  


生成器

生成器的编写方法和函数定义类似,只是在return的地方改为yield。

生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。

生成器自身又构成一个迭代器,每次迭代时使用一个yield返回的值。


需要注意的是,生成器中不需要return语句,不需要指定返回值,在生成器中已经存在默认的返回语句

生成器表达式

[python] view plaincopy

  1. (i for i in range(5))  

  2.   

  3. // 返回迭代器  

  4.   

  5. <generator object <genexpr> at 0x7ff3e8f0d960>  



列表解析,返回list

[python] view plaincopy

  1. [i for i in range(5)]  

  2.   

  3. // 返回list  

  4.   

  5. [01234]  


在这里存在一个问题,那就是range(5)会返回一个长度为5的数据,如果是range(1000)那么就会占用一个1000大小的数组空间;如果我们采用`生成器`,在需要的时候产生一个数字,那么空间的占用情况就会降低,这里我们可以使用xrange()函数来实现。

[python] view plaincopy

  1. ‘‘‘‘‘ 

  2.  

  3. xrange 

  4.  

  5.     函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。 

  6.  

  7. xrange示例: 

  8.  

  9. ‘‘‘   

  10.   

  11. >>> xrange(5)  

  12.   

  13. xrange(5)  

  14.   

  15. >>> list(xrange(5))  

  16.   

  17. [01234]  

  18.   

  19. >>> xrange(1,5)  

  20.   

  21. xrange(15)  

  22.   

  23. >>> list(xrange(1,5))  

  24.   

  25. [1234]  

  26.   

  27. >>> xrange(0,6,2)  

  28.   

  29. xrange(062)  

  30.   

  31. >>> list(xrange(0,6,2))  

  32.   

  33. [024]  


所以xrange做循环的性能比range好,尤其是返回很大的时候,尽量用xrange吧,除非你是要返回一个列表。 

参考来源: 
Python迭代器和生成器介绍
http://www.lai18.com/content/384355.html


Python迭代器和生成器介绍

标签:

原文地址:http://my.oschina.net/u/2321543/blog/403843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!