zluxingzhe 2019-12-06
迭代器(iterator)--实现了__next()__方法的对象
可迭代对象(iterable)--实现了__iter()__方法的对象
对一个可迭代对象调用内置函数iter(),可以获得一个迭代器,对一个迭代器使用next()函数,就可以“延迟产生一个值”(lazily produce next value)
所以用for循环去循环迭代迭代器的过程,可以理解为for循环执行了如下的步骤:
生成器(generator)--生成器也是一种迭代器,多数生成器和普通的def定义的函数没有区别,只是将返回值时的return换成了yield,这样每次使用yield返回一个值后,函数将冻结在这里,等待重新被唤醒,然后继续从停止的地方继续执行(返回下一个值)。一次计算返回一个结果,而不用一次性地把所有值都计算出来,然后存储在内存之中,这样可以节省大量的内存消耗
生成器会自动实现__iter()__方法和__netx()__方法,但是只能对生成器迭代一次
除了用函数+yield构成一个生成器外,还有一种产生生成器的方法,就是生成器表达式(将列表推导表达式的中括号换成了圆括号):
sum(i*i for i in range(10)) #生成器表达式返回一个生成器对象,而生成器也是迭代器,所以可以用sum()把这个生成器所有元素提取出来并求和