可迭代对象和迭代器对象;前者生成后者
比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象
需求:从网络抓取各个城市气温信息,并依次显示
若依次抓取较多的城市,有较高的访问延迟,并且浪费存储空间,
希望以 “用时访问”策略 将所有的城市气温封装在
一个对象,可 用for语句迭代,如何解决?
方法:
一:实现一个迭代器对象,next()方法返回每一个城市气温
二:实现一个可迭代对象,__iter__方法返回一个迭代器对象
import requests #print(getWeather(u"北京")) #创建一个迭代器
from collections import Iterable,Iterator
class WeatherIterator(Iterator):
def __init__(self,cities):
self.cities = cities
self.index = 0
def getWeather(self,city):
r =requests.get(u"http://wthrcdn.etouch.cn/weather_mini?city=" + city)
data = r.json()['data']['forecast'][0]
return '{0}:{1},{2}'.format(city, data['low'],data['high']) def __next__(self):
if self.index == len(self.cities):
raise StopIteration
city = self.cities[self.index]
self.index += 1
return self.getWeather(city)
#生成一个可迭代对象
class WeatherIterable(Iterable):
def __init__(self,cities):
self.cities = cities
def __iter__(self):
return WeatherIterator(self.cities) for w in WeatherIterable([u"北京",u"肥城",u"呼和浩特"]):
print(w)