栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python实现可迭代对象和迭代器对象

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python实现可迭代对象和迭代器对象

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

        实际案例:

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

                        北京:15~20

                        天津:17~22

                        长春:12~18

                        ... ...

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

        解决方案:

                Step1:实现一个迭代器对象WeatherIterator,用__next__(方法每次返回一个城市气温。

                Step2:实现一个可迭代对象WeatherIterable,用__iter__()方法返回一个迭代器对象。

2、代码演示

(1)获取一个城市气温的函数实现

# _*_ encoding:utf-8 _*_
import requests


def get_weather(city):
    # 获取一个城市的气温函数
    r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city=' + city)
    print(r.json())
    data = r.json()['data']['forecast'][0]
    return '%s: %s, %s' % (city, data['low'], data['high'])


# [u'北京', u'上海', u'广州', u'长春']
print(get_weather(u'北京'))
print(get_weather(u'长春'))

(2)查看迭代器对象和迭代对象的抽象接口

from collections.abc import Iterable, Iterator

# 查看迭代器的抽象接口,frozenset({'__next__'})
print(dir(Iterator))
print(Iterator.__abstractmethods__)
# 查看迭代对象的抽象接口,frozenset({'__iter__'})
print(dir(Iterable))
print(Iterable.__abstractmethods__)

(3)实现天气迭代器对象和迭代对象

        注:继承迭代器或迭代对象时,必须实现包含抽象方法,如:(2)

# _*_ encoding:utf-8 _*_
from collections.abc import Iterable, Iterator
import requests


# 实现天气迭代器继承Iterator
class Weather_Iterator(Iterator):

    def __init__(self, cities):
        # 定义构造器
        self.cities = cities  # 城市列表
        self.index = 0  # 迭代位置

    def get_weather(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(self.cities):
            # 如果迭代位置等于城市列表长度表示迭代玩了,抛异常
            raise StopIteration
        city = self.cities[self.index]
        self.index += 1
        return self.get_weather(city)


# 实现天气的可迭代对象,继承Iterable
class Weather_Iterable(Iterable):
    def __init__(self, cities):
        self.cities = cities

    def __iter__(self):
        # 返回一个Weather_Iterator实例
        return Weather_Iterator(self.cities)


# [u'北京', u'上海', u'广州', u'长春']
for x in Weather_Iterator([u'北京', u'上海', u'广州', u'长春']):
    print(x)

# 运行结果:
北京: 低温 8℃, 高温 13℃
上海: 低温 15℃, 高温 22℃
广州: 低温 24℃, 高温 31℃
长春: 低温 3℃, 高温 14℃

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/844035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号