問題舉例
某軟體要求,從網路抓取各個城市的氣溫資訊,並依次顯示:
北京:15~22
上海:18~23
如果一次抓取所有城市氣溫資訊再顯示,顯示第乙個城市的氣溫時會由很長的延時,
並且浪費儲存空間,我們期望以「用時訪問」的策略,並且把所有城市的氣溫資訊封裝
到乙個物件裡,可用for語句進行迭代。
來個栗子
list1 = [1, 2, 3, 4, 5]for ele in
list1:
(ele)
it =iter(list1)
next(it)
next(it)
next(it)
next(it)
next(it)
next(it)
for迴圈中in後面的物件一定為可迭代物件
iter()返回乙個可迭代器物件,由可迭代物件生成
next()方法對迭代器物件進行迭代
最後報異常stopiteration
迭代器物件為一次性消費,用完不可再生,
如果要使用,需要重新拿到迭代器,
兩個迭代器之間無干擾。
栗子
list1 = [1, 2, 3, 4, 5]it1 =iter(list1)
print(next(it1)) #
1print(next(it1)) #
2print("
\nfor loop")
for x in
it1:
(x)#3#
4#5print("
\nno interference between two iters")
it2 =iter(list1)
it3 =iter(list1)
print(next(it2)) #
1print(next(it3)) #
1print(next(it2)) #
2print(next(it3)) #
2
迭代器物件是乙個可迭代物件又是乙個迭代器物件,呼叫可迭代介面(__iter__)返回它自身。
可迭代物件每次都建立乙個迭代器。
step1:實現乙個迭代器物件weatheriterator,__next__每次返回乙個城市的氣溫資訊
step2:實現乙個可迭代物件weatheriterable,__iter__方法返回乙個weatheriterator物件
**:
from collections importiterable, iterator
import
requests
class
weatheriterator(iterator):
def__init__
(self, cities):
self.cities =cities
self.index =0
def__next__
(self):
if self.index ==len(self.cities):
raise
stopiteration
city =self.cities[self.index]
self.index += 1
return
self.get_weather(city)
defget_weather(self, city):
url = '
' +city
r =requests.get(url)
data = r.json()['
data
']['
forecast
'][0]
return city, data['
high
'], data['
low'
]class
weatheriterable(iterable):
def__init__
(self, cities):
self.cities =cities
def__iter__
(self):
return
weatheriterator(self.cities)
defshow(w):
for x in
w:
(x)w = weatheriterable(['
北京', '
上海', '
廣州'] * 10)
show(w)
python 迭代器與可迭代物件
主要有兩個方法next 與iter next不斷返回下乙個元素,知道元素全部返回後出現異常,可以節省記憶體空間。iter是迭代,可以把乙個列表直接轉換成迭代器,然後使用next 方法。data list 1,2,3,4,5 data list iter data list print next da...
Python 迭代器與可迭代物件
迭代器可以讓我們訪問集合的時候變得非常方便。之前我們通過for.in.的方式訪問乙個集合的時候,就是使用迭代器完成的。如果沒有迭代器,那麼我們只能通過while迴圈,每次迴圈的時候通過下標訪問了。可以直接使用for迴圈遍歷的物件,成為可迭代的物件,常見的可迭代的物件有 list tuple dict...
Python迭代器與可迭代物件
當掃瞄記憶體中放不下的資料集時,我們需要找到一種惰性獲取資料項的方式,每次 取出 1個。這就是迭代器相對於普通可迭代物件的優勢 節省記憶體 l orange pear 列表就是乙個可迭代物件在python中,很多內建的資料型別都是可迭代物件,如列表,字串,元組,字典,集合等 如果要自己構建乙個可迭代...