• 问题8~9:如何实现可迭代对象和迭代器对象


    问题8~9:如何实现可迭代对象和迭代器对象

     

    一)通过可迭代对象和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)
  • 相关阅读:
    Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程
    nginx上传模块—nginx upload module-
    解决nginx上传模块nginx_upload_module传递GET参数
    nginx upload module的使用
    Nginx Upload Module 上传模块
    产品需求分析神器:KANO模型分析法
    SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例
    BAT、网易、京东等如何做大数据风控的?
    springboot 2.x 集成 drools 7.x
    Drools介绍与使用
  • 原文地址:https://www.cnblogs.com/valorchang/p/11434615.html
Copyright © 2020-2023  润新知