如何实现可迭代对象和迭代器对象(一)

来源:互联网 发布:cpu测温度软件 编辑:程序博客网 时间:2024/05/22 02:03
实际案例

某软件要求,从网站抓取各个城市气温信息,并依次显示:

  北京:15~20
  天津:17~22
  长春:12~18
  ……

如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间。我们期望以“用时访问”的策略,并且能把所有城市气温封装到一个对象里,可用for语句进行迭代。那么具体如何解决?

我们要实现可迭代对象和迭代对象,就先要了解什么是可迭代对象和迭代对象。为了说明这两个概念,我们先看如下代码:

l = [1, 2, 3, 4]s = 'abcd'for x in s:    print xfor i in l:    print i

相信大家都能看懂上述代码并能够知道该代码的输出结果。那么我们现在来分析一下代码:代码中两个for分别循环遍历列表、字符串,其实这里的两个for循环实质上是在对列表、字符串进行迭代。因此,列表和字符串这种可以可迭代的对象称为可迭代对象。

此处以列表l为例,其迭代(循环遍历)的原理为:

  1. 列表l实现__iter__(),返回一个迭代器,所谓的迭代器就是具有next方法的对象,即迭代器对象;
  2. 迭代器对象在调用next方法时,迭代器对象会返回它的下一值。如果next方法被调用,但迭代器对象没有值返回,就会引发一个StopIterration异常。

注:Python 3.X版本中,next方法变化为__next__() 。

代码演示如下:

l = [1, 2, 3, 4]# iter(l)i = l.__iter__()print i.next()print i.next()print i.next()print i.next()print i.next()

其输出结果如下:

1234Traceback (most recent call last):  File "D:/Codes/imooc/Python/012.py", line 12, in <module>    print i.next()StopIteration

简书个人主页:http://www.jianshu.com/u/766a46e00f6b