python 迭代器和生成器


你也可以自己实现一个迭代器,如上所述,只需要在类的__iter__方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即可。但是需要自己实现迭代器的时候不多,即使需要,使用生成器会更轻松。
 
#!/usr/bin/env python
# coding=utf-8
 
class test:
    def __init__(self, input_list):
        self.list = input_list
        self.i = 0
 
    def __iter__(self):
        return self
    
    def next(self):
        if self.i == len(self.list):
            self.i = 0
            raise StopIteration
        self.i += 1
        return  self.list[self.i - 1]
 
 
使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。
 
例如:
 
/* 把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 */
for line in open("test.txt").readlines():
    print line
 
/* 这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行 */
for line in open("test.txt"):   #use file iterators
    print line
生成器
生成器的编写方法和函数定义类似,只是在return的地方改为yield。
 
生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。
 
生成器自身又构成一个迭代器,每次迭代时使用一个yield返回的值。
 
 
 
需要注意的是,生成器中不需要return语句,不需要指定返回值,在生成器中已经存在默认的返回语句
 
生成器表达式
 
(i for i in range(5))
// 返回迭代器
<generator object <genexpr> at 0x7ff3e8f0d960>
列表解析,返回list
 
[i for i in range(5)]
// 返回list
[0, 1, 2, 3, 4]
 

评论关闭