3-1 实现可迭代对象和迭代器对象

本文介绍了一个使用Python实现的城市天气信息迭代器。通过定义WeatherIterator和WeatherIterable类,实现了按需获取多个城市天气信息的功能,避免了一次性加载所有数据造成的延迟和存储空间浪费。
# -*- utf-8 -*-

"""
实际用例:
从网络抓取各个城市气温信息,并依次显示:
北京:15~20
天津:17~22
长春:12~18
.....

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

解决方案:
step1:实现一个迭代器对象WeatherIterator,next方法每次返回一个城市气温
step2:实现一个可迭代对象WeatherIterator,__iter__方法返回一个迭代器对象.
"""


l = [1, 2, 3, 4]
s = 'abcde'

for x in l:print(x)
for x in s:print(x)
# l, s(可迭代对象) ---iter()-->迭代器对象
# iter(l)实际调用的是l.__iter__()
# iter(s)实际调用的是s.__getitem__()

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



import requests

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):       # 重写了父类中的__next__()方法
        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):              # 重写了父类中的__iter__()方法
        return WeatherIterator(self.cities)

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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值