一)通過可迭代物件和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一)通過可迭代物件和python內建函式iter()得到迭代器:即,iter(可迭代物件) --> 得到乙個迭代器;import requests
from collections import iterable, iterator
# 氣溫迭代器,
class weatheriterator(iterator):
#傳入城市名字的字串列表
def __init__(self, cities):
self.cities = cities
#記錄乙個index,刻畫迭代的位置,初始化為0
self.index = 0
# city是城市名字的字串
def getweather(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 weatheriterator(self.cities)
#演示,只想要4個城市的氣溫資訊;
for x in weatheriterable([u'北京', u'上海', u'廣州', u'長春']):
print(x)
例: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:utf8import requests
from collections import iterable, iterator
# 氣溫迭代器,
class weatheriterator(iterator):
#傳入城市名字的字串列表
def __init__(self, cities):
self.cities = cities
#記錄乙個index,刻畫迭代的位置,初始化為0
self.index = 0
# city是城市名字的字串
def getweather(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 weatheriterator(self.cities)
#演示,只想要4個城市的氣溫資訊;
for x in weatheriterable([u'北京', u'上海', u'廣州', u'長春']):
print(x)
如何實現可迭代物件和迭代器物件 二
之前我們介紹了可迭代物件和迭代器物件,現在我們就實現這兩個物件,滿足實際案例中的需求,解決方案如下 實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市的氣溫 實現乙個可迭代物件weatheriterable,iter 方法返回乙個迭代器物件。如下 coding utf 8...
python迭代和如何判斷乙個物件是可迭代物件
可以理解為,任意的集合使用for迴圈遍歷 python中,迭代永遠是取出元素本身,而非元素的索引。對於有序集合,有時候會需要取出元素的索引,可以使用python內建的enumerate函式。enumerate函式可以把乙個list變成索引 元素對,這樣就可以在for迴圈中同時迭代索引和元素本身。li...
Python 如何實現可迭代物件和迭代器物件
一 通過可迭代物件和python內建函式iter 得到迭代器 即,iter 可迭代物件 得到乙個迭代器 例 list 1 1,2,3,4,5 1 iter 物件 若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列 iter 或者 getitm 2 迭代器只有乙個介面 next 呼叫next 時會...