zoukankan      html  css  js  c++  java
  • Python:如何实现可迭代对象和迭代器对象

    一)通过可迭代对象和Python内置函数iter()得到迭代器:即,iter(可迭代对象)  -->  得到一个迭代器;

    例:list_1 = [1, 2, 3, 4, 5]

    1、iter(对象),若此对象想满足迭代要求,其内部要有迭代接口或者一个序列:__iter__()或者__getitm__()

    • iter(list_1)  <==>  list_1.__iter__(),对可迭代对象执行iter()方法,就是调用list_1的内部方法__iter__(),即迭代器接口,通过__iter__()方法,生产一个迭代器,对list_1中的元素进行迭代;

    2、迭代器只有一个接口:next(),调用next()时会自动获得生产此迭代器的对象的一个值;

    t = iter(list_1)

    t.next()

    #输出1

    • for i in list_1:  即==> 不停的执行iter(list_1).next(),直到迭代出现异常时(StopIteration),迭代结束,返回迭代结果;
    • 迭代接口,由python软件内部赋予的功能;

    二)案例:

    要求:从网站抓取需要的城市气温信息,并依次显示;

    问题:如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间;期望从‘用时访问’的策略,并且能把所有城市气温装到一个对象里,可用for语句进行迭代。如何实现?

    方案:

    1. 实现一个迭代器对象WeatherIterator,next方法每次返回一个城市气温;
    2. 实现一个可迭代对象WeatherIteratble,__iter__方法返回一个迭代器对象;
    #coding:utf8
    
    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'http://wthrcdn.etouch.cn/weather_mini?city=' + 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)

     # 

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/volcao/p/8729246.html
Copyright © 2011-2022 走看看