实际案例
某软件要求,从网站抓取各个城市气温信息,并依次显示:
北京:15~20
天津:17~22
长春:12~18
......
如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间。我们期望以“用时访问”的策略,并且能把所有城市气温封装到一个对象里,可用for语句进行迭代。那么具体如何解决?
我们要实现可迭代对象和迭代对象,就先要了解什么是可迭代对象和迭代对象。为了说明这两个概念,我们先看如下代码:
l = [1, 2, 3, 4]
s = 'abcd'
for x in s:
print x
for i in l:
print i
相信大家都能看懂上述代码并能够知道该代码的输出结果。那么我们现在来分析一下代码:代码中两个for分别循环遍历列表、字符串,其实这里的两个for循环实质上是在对列表、字符串进行迭代。因此,列表和字符串这种可以迭代的对象称为可迭代对象。
此处以列表l为例,其迭代(循环遍历)的原理为:
- 列表l实现__iter__(),返回一个迭代器,所谓的迭代器就是具有next方法的对象,即迭代器对象;
- 迭代器对象在调用next方法时,迭代器对象会返回它的下一值。如果next方法被调用,但迭代器对象没有值返回,就会引发一个StopIteration异常。
注: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()
其输出结果如下:
1
2
3
4
Traceback (most recent call last):
File "D:/Codes/imooc/Python/012.py", line 12, in <module>
print i.next()
StopIteration