美文网首页
如何实现可迭代对象和迭代器对象?

如何实现可迭代对象和迭代器对象?

作者: Diolog | 来源:发表于2019-02-09 12:46 被阅读0次

    实际案例:

    • 某软件需求,从网络抓取各个城市气温信息,并依次显示:
      北京:15~20
      天津:17~22
      长春:12~18
      ...
      如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间.我们期望以"用时访问"的策略,并且能把所有城市气温封装到一个对象里,可用for语句进行迭代,如何解决?

    首先了解什么是可迭代对象:
    经常接触到的可迭代对象有:List、String、Dict、Set、Tuple等
    最好的判断方式为:对象的内置对象中存在iter 或者getitem(序列)方法。

    首先我们实现天气获取的请求API:

    #coding:utf8
    import requests
    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 x in WeatherIterable(['常州','苏州','上海','南京']) :
      print(x)
    
    输出结果:
    常州:低温 0℃,高温 2℃
    苏州:低温 0℃,高温 4℃
    上海:低温 3℃,高温 5℃
    南京:低温 -1℃,高温 1℃
    

    相关文章

      网友评论

          本文标题:如何实现可迭代对象和迭代器对象?

          本文链接:https://www.haomeiwen.com/subject/mavasqtx.html