實際案例
某軟件要求粮彤,從網(wǎng)站抓取各個城市氣溫信息陌选,并依次顯示:
北京:15~20
天津:17~22
長春:12~18
......
如果一次抓取所有城市天氣再顯示板鬓,顯示第一個城市氣溫時坯辩,有很高的延時秧倾,并且浪費存儲空間怨酝。我們期望以“用時訪問”的策略,并且能把所有城市氣溫封裝到一個對象里那先,可用for語句進行迭代农猬。那么具體如何解決?
我們要實現(xiàn)可迭代對象和迭代對象售淡,就先要了解什么是可迭代對象和迭代對象斤葱。為了說明這兩個概念,我們先看如下代碼:
l = [1, 2, 3, 4]
s = 'abcd'
for x in s:
print x
for i in l:
print i
相信大家都能看懂上述代碼并能夠知道該代碼的輸出結(jié)果揖闸。那么我們現(xiàn)在來分析一下代碼:代碼中兩個for分別循環(huán)遍歷列表揍堕、字符串,其實這里的兩個for循環(huán)實質(zhì)上是在對列表汤纸、字符串進行迭代衩茸。因此,列表和字符串這種可以迭代的對象稱為可迭代對象贮泞。
此處以列表l為例楞慈,其迭代(循環(huán)遍歷)的原理為:
- 列表l實現(xiàn)__iter__()幔烛,返回一個迭代器,所謂的迭代器就是具有next方法的對象囊蓝,即迭代器對象饿悬;
- 迭代器對象在調(diào)用next方法時,迭代器對象會返回它的下一值聚霜。如果next方法被調(diào)用狡恬,但迭代器對象沒有值返回,就會引發(fā)一個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()
其輸出結(jié)果如下:
1
2
3
4
Traceback (most recent call last):
File "D:/Codes/imooc/Python/012.py", line 12, in <module>
print i.next()
StopIteration