首先应该先理解几个东西:
L=[1,2,3,4,5]
for i in l :
print i
#这里的l就是一个可迭代对象, 其实迭代过程是调用l.__inter__接口,
p= iter(l)
#这里的p就是一个迭代器对象, p.next 进行迭代访问直到访问完
其次,标准库collections 里面有两个超好用的Iterable,Iterator 的类 分别对应到可迭代对象和迭代器对象
In [2]: Iterable.__abstractmethods__
Out[2]: frozenset({'__iter__'})
In [3]: Iterator.__abstractmethods__
Out[3]: frozenset({'next'})
其实个人理解可迭代器对象 其实就是对象为可迭代的字符串,列表的数据类型, 而迭代器对象就是指的对象为迭代对象,拥有next的方法去迭代对象;
话不多说,来个小案例 ,通过抓取某网站的天气预报,依次显示所需信息。要求为一次抓取所需城市的天气再显示,会有很高的延时,且浪费存储空间,但是如果用“用时访问”的策略,将所有的需要的城市的气温封装到一个对象里,用for去迭代:
from collections import Iterable,Iterator
class weatheriterator(Iterator):
#构造一个迭代器
def __init__(self,cities):
self.cities=cities
#记录迭代的位置
self.index= 0
def get_weather(self,city):
r= requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)
data = r.json()['data']['forecast'][0]
return '%s:%s,%s'%(city,data['low'],data['high'])
#迭代器对象需构造next方法
def next(self):
if self.index==len(self.cities):
raise StopIteration
city = self.cities[self.index]
self.index +=1
return self.get_weather(city)
class weatheriterable(Iterable):
#构造一个可迭代对象
def __init__(self,cities):
self.cities= cities
def __iter__(self):
return weatheriterator(self.cities)
#构造一个实例
for x in weatheriterable([u'北京',u'上海',u'广州',u'杭州',u'南通']):
print x
hadoop@ubuntu:~/pyfile$ python iterato.py
北京:低温 25℃,高温 36℃
上海:低温 29℃,高温 37℃
广州:低温 26℃,高温 32℃
杭州:低温 28℃,高温 38℃
南通:低温 26℃,高温 34℃
简单的通过request爬了天气,再通过建立迭代器和可迭代对象来迭代访问抓取数据~