就目前的理解来说,迭代器就是一个有着__iter__()方法的对象,但这只是必要条件,一个有__iter__()方法的对象调用此方法,返回的结果就是一个迭代器,__iter__()方法将一个普通列表变成一个迭代器。例如,l = [1,2,3],L = l.__iter__(),此时,L就是一个迭代器,可以调用next()方法来遍历迭代器中的值,L.next()(next()函数用于手动迭代)。目前来看迭代器主要用于for循环中遍历元素,优点是可以节省内存,例如,如果想读取并按行输出一个文件,我们可以for line in open('file').readlines()  print line,但是这样需要把整个文件独入内存,如果用迭代器,for line in open('file')  print line,可以节省内存。

      生成器与普通函数很像,唯一一点不同是把普通函数的return换成了yield,区别在于普通函数在执行完return之后就返回,但是生成器在yield之后会阻塞,并保留状态,等待下一次的生成器函数调用。

def buildsquare(N):
    for i in range(N):
        yield i ** 2
for i in buildsquare(5):
    print i

输出结果为0,1,4,9,16。类似的我们可以用普通函数的方式来实现。

def buildsquare(N):
    res = []
    for i in range(N):
        res.append(i ** 2)
    return res
print buildsquare(5)

生成器在yield结束之后就在原地待命,并保存当前状态,下次调用生成器时恢复状态。