Python 迭代器/生成器

zluxingzhe 2019-12-06

迭代器(iterator)--实现了__next()__方法的对象

可迭代对象(iterable)--实现了__iter()__方法的对象

对一个可迭代对象调用内置函数iter(),可以获得一个迭代器,对一个迭代器使用next()函数,就可以“延迟产生一个值”(lazily produce next value)

所以用for循环去循环迭代迭代器的过程,可以理解为for循环执行了如下的步骤:

  1. 对对象调用iter()函数,获得一个迭代器
  2. 使用next()内置函数来调用__next__()方法,获得下一个值
  3. 当元素用尽时, __next()__将引发StopIteration异常

生成器(generator)--生成器也是一种迭代器,多数生成器和普通的def定义的函数没有区别,只是将返回值时的return换成了yield,这样每次使用yield返回一个值后,函数将冻结在这里,等待重新被唤醒,然后继续从停止的地方继续执行(返回下一个值)。一次计算返回一个结果,而不用一次性地把所有值都计算出来,然后存储在内存之中,这样可以节省大量的内存消耗

生成器会自动实现__iter()__方法和__netx()__方法,但是只能对生成器迭代一次

除了用函数+yield构成一个生成器外,还有一种产生生成器的方法,就是生成器表达式(将列表推导表达式的中括号换成了圆括号):

sum(i*i for i in range(10)) #生成器表达式返回一个生成器对象,而生成器也是迭代器,所以可以用sum()把这个生成器所有元素提取出来并求和

相关推荐