谈谈python迭代器与生成器

问题

python 为什么会有迭代器和生成器这两个东西,或者可以说这两个东西有什么优点?

解答

要回答问题一,首先就要知道什么是迭代器?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iternext()(python2中实现next())方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。

正式因为他是通过next()来返回迭代器中的元素,所以它是一种延迟计算方式返回对象,这种特点对于大数据量元素进行遍历时具有明显优势,他不会一次性把所有元素载入内存,而是遍历一个载入一个,大大降低了内存的占用。

生成器,简单来说就是使用了yield关键字的函数,都叫做生成器。例如:

>>> def func():
...     yield
...
>>> f = func()
>>> type(f)
<type 'generator'>
>>>

yield的作用是挂起当前执行的函数,并返回,直到调用next(),继续执行后续指令,直到再次遇到yield或者抛出StopIteration异常。上面的例子第一次运行生成器f,需要首先调用f.next()启动生成器。

生成器的优点:代码实现更加简洁,可以提高代码的可读性。同时当然也具有迭代器的优点,大量数据遍历时内存占用少。


注意


  1. 生成器一定是迭代器,但是迭代器不一定是生成器,因为创建一个迭代器只需要实现iternext()方法就可以了,并不一定要使用yield实现。

  2. 生成器的唯一注意事项就是:生成器只能遍历一次。

[TOC]来生成目录:

猜你喜欢

转载自blog.csdn.net/yrx0619/article/details/80740767