python3基础之迭代器的使用

    在说迭代器之前先说说什么是迭代,迭代是访问集合元素的一种方式。这里的集合不单指set,而是许多数据的合集,如果是一个数据直接访问就可以了。至于是什么样的方式,用了就知道了。看个例子:

    image.png

    在上面的测试例子中,我们使用iter函数为列表l创建了一个迭代器it,然后用for循环遍历it达到访问列表的目的。由此可见迭代器it是用来访问列表l的一个对象。他本质上是一个对象。看到这里肯定会有些吃瓜群众表示不服,访问列表直接for i in l不就行了,我要这迭代器干什么?

    事实上for循环在遍历列表时先隐式调用了iter函数获得了迭代器(我猜的)。既然是猜测的自然不够说服力,看来要再找个例子了。我们知道列表是python内置的类,那假如现在有个自定义的类叫名单(Namelist),我该怎么遍历名单呢?用for循环试试:

    image.png

    测试例子中试图用for循环来遍历名单对象,结果报错了,错误提示名单对象不可迭代。这下该明白迭代器的作用了吧,顺便还应该感谢python把列表封装好了,让我们这么容易就遍历它。

    知道迭代器可以用来访问对象,那应该如何定义迭代器呢?还是以Namelist为例:

image.png

   在这里我们实现了两个特殊函数__iter__和__next__,前者是用来返回访问该对象的迭代器对象,后者是用来返回下一个元素。__iter__返回了self,也就是说Namelist既是要集合,又是迭代器。函数里的代码应该很容易理解,这里就不做解释了,但是在运行时虽然成功访问了名单,但最后还是报错了,因为for不知道什么时候结束,它一直调用__next__导致最后越界了。所以在写迭代器时要注意结尾,就像这样:

image.png

 在__next__函数加了一个判断,当下标小于列表的长度时一个名字,否则抛出StopIteration的异常。这样for就知道该结束了。至于什么是异常等我学会了再说吧。

演示站
上一篇:python3基础之如何重载运算符(实例)
下一篇:python3基础之如何使用列表推导式

发表评论