一)通過可迭代物件和python內建函式iter()得到迭代器:即,iter(可迭代物件) --> 得到乙個迭代器;
例:list_1 = [1, 2, 3, 4, 5]
1、iter(物件),若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列:__iter__()或者__getitm__()
2、迭代器只有乙個介面:next(),呼叫next()時會自動獲得生產此迭代器的物件的乙個值;
t = iter(list_1)
t.next()
#輸出1
二)案例:
問題:如果一次抓取所有城市天氣再顯示,顯示第乙個城市氣溫時,有很高的延時,並且浪費儲存空間;期望從『用時訪問』的策略,並且能把所有城市氣溫裝到乙個物件裡,可用for語句進行迭代。如何實現?
方案:實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市氣溫;
實現乙個可迭代物件weatheriteratble,__iter__方法返回乙個迭代器物件;
#coding:utf8
import
requests
from collections import
iterable, iterator
#氣溫迭代器,
class
weatheriterator(iterator):
#傳入城市名字的字串列表
def__init__
(self, cities):
self.cities =cities
#記錄乙個index,刻畫迭代的位置,初始化為0
self.index =0
#city是城市名字的字串
defgetweather(self, city):
#用requests庫,對一固定**進行get請求,得到乙個json形式資料;
r = requests.get(u'
' +city)
#對json資料解析,得到資料:data
data = r.json()['
data
']['
forecast
'][0]
#返回目標資料:data['low'], data['high']
return
'%s: %s, %s
' % (city, data['
low'], data['
high'])
#迭代器物件實現的方法:next;功能:每次返回乙個城市的資訊,最終迭代完後丟擲乙個異常
def__next__(self):
#用if語句刻畫最終迭代完後的狀況;self.index,刻畫迭代的位置
if self.index ==len(self.cities):
raise
stopiteration
#正常迭代情況,即每次迭代出乙個城市的氣溫資訊;self.cities[self.index],得到需要的城市名字
city =self.cities[self.index]
#每迭代一次,要對index + 1
self.index += 1
#將目標城市名字傳入geweather方法,得到目標城市的氣溫資訊;
return
self.getweather(city)
#實現可迭代物件,繼承iterable,則對weatheriterable例項化時,需要傳入乙個可迭代的物件;
class
weatheriterable(iterable):
def__init__
(self, cities):
#先維護cities,為了後面傳給構造器weatheriterator
self.cities =cities
#可迭代介面,在其內部返回weatheriterator
def__iter__
(self):
#報錯:can't instantiate abstract class weatheriterator with abstract methods __next__,
#即:不能用抽象的方法例項化抽象類weatheriterator ———將next方法改為__next__()方法;
return
weatheriterato
r(self.cities)
#演示,只想要4個城市的氣溫資訊;
for x in weatheriterable([u'
北京', u'
上海', u'
廣州', u'長春'
]):
print(x)
如何實現可迭代物件和迭代器物件 二
之前我們介紹了可迭代物件和迭代器物件,現在我們就實現這兩個物件,滿足實際案例中的需求,解決方案如下 實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市的氣溫 實現乙個可迭代物件weatheriterable,iter 方法返回乙個迭代器物件。如下 coding utf 8...
Python 可迭代物件
1.可迭代物件 以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield 的 generator function 這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 2...
python可迭代物件
0 在python中只要是能用for in的,都是可迭代物件,讓我們看下定義 定義 我們已經知道可以對list tuple dict set str等型別的資料使用for in 的迴圈語法,會從其中依次拿到資料元素進行使用,我們把這樣的過程稱為遍歷,也叫迭代。所以我們把可以通過for in 這類語句...