美文网首页
如何实现自定义的可迭代对象和迭代器对象

如何实现自定义的可迭代对象和迭代器对象

作者: 以七v为书 | 来源:发表于2018-12-18 16:30 被阅读0次

    问题
    某软件要求,从网络抓取各个城市气温信息,并依次展示

    如果一次抓取所有城市天气再显示,显示第一个城市气温时,
    有很高的延时,并且浪费存储空间.我们期望以"用时访问"策略,
    并且能把所有城市气温封装到一个对象,可用for语句进行的迭代,
    如何解决?

    • 我们先来观察一下我们日常中用到的可迭代对象他们之间的共性。
    # -*- coding: utf-8 -*-
    l = [1,2,3,4]
    s = 'abcde'
    
    ## 确保in后面是一个可迭代对象
    #由可迭代对象得到迭代器
    for x in l:print x
    for x in s:print x
    
    # 使用iter可以将可迭代对象list变成一个迭代器对象
    print iter(l)
    print iter(s)
    #此处传入不可迭代对象将会抛出异常
    # print iter(5)
    
    
    #使用dir函数来查看当前对象可以使用的方法:__为内置方法
    
    print dir(l)
    print dir(s)
    
    print iter(l)
    
    #等价于list对象l调用了__iter__()
    print l.__iter__()
    
    #要么能支持一个迭代器,要么支持一个序列
    #s.字符串对象不包含__iter__,但是它拥有__getitem__
    print s.__getitem__(0)
    
    
    #一个迭代器对象拥有哪些接口?
    #
    print dir(iter(l))
    # 可以看出它只有一个next方法。
    t = iter(l)
    print t.next()
    print t.next()
    print t.next()
    print t.next()
    # print t.next()
    #次数一直调用next方法,直到抛出stop异常
    

    通过上述探究可以发现可迭代对象必须拥有iter或getitem方法而。而迭代器对象则拥有next方法。

    for循环内部将l这个可迭代的对象使用iter()变成一个迭代器对象,
    然后调用next()方法不断取值,当值全部遍历完时,抛出stopexception。

    因此我们想实现一个可迭代对象需要两步:

    step1:实现迭代器对象WeatherIterator,next方法每次返回一个城市的气温
    step2:实现一个可迭代对象,WeatherIterable,iter方法返回一个迭代器对象

    import requests
    
    # def getweather(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'])
    
    # print getweather(u'北京')
    # print getweather(u'长春')
    
    from collections import Iterable, Iterator
    
    print Iterator.__abstractmethods__
    print Iterable.__abstractmethods__
    
    ##直接继承抽象类
    
    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 '%s :%s ,%s'%(city, data['low'],data['high'])
        
        def next(self):
            if self.index == len(seld.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([u'北京',u'上海',u'广州',u'长春']):
        print x
    

    相关文章

      网友评论

          本文标题:如何实现自定义的可迭代对象和迭代器对象

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