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

时间:2022-10-15 14:01:44

什么是可迭代对象?

列表、字符串

for循环的本质?

for循环要确保in后面的对象为可迭代对象,如何确保?

iter() 方法得到一个迭代器对象

不停.__next__() 方法对迭代器对象进行迭代,直到捕获StopIteration异常跳出循环

为啥列表和字符串可以迭代?

满足了一种接口,.__iter__(),__getitem__()

iter() 去找.__iter__(),__getitem__(),没找到则为不可迭代

迭代器对象只有一个__next__()方法,都迭代完毕,抛出一个异常

如何实现这个案例?

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

北京: 15~20

天津: 17~22

长春: 12 ~18

...

出现一个问题,如果一次抓取所有城市信息再显示,会有很大的延迟,并浪费存储空间,用户体验并不好

如何解决这个问题?

    1. 实现一个迭代器对象,next方法返回每一个城市天气
    2. 实现一个可迭代对象,__iter__方法返回一个可迭代对象

代码逻辑:

#!/usr/bin/python3

import requests
import json
from collections import Iterator, Iterable

class WeatherIterator(Iterator):
    """
    迭代器
    """

    def __init__(self, cites):
        # 初始cities参数和index参数
        self.cites = cites
        self.index = 0

    def get_weather(self, city):
        # 获取天气信息
        r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city)
        data = json.loads(r.text)['data']['forecast'][0]
        return '%s: %s, %s' % (city, data['low'], data['high'])

    def __next__(self):
        # next方法进行迭代,每次next都会取一个值交给get_weather函数处理并返回处理的值
        if self.index == len(self.cites):
            raise StopIteration
        city = self.cites[self.index]
        self.index += 1
        return self.get_weather(city)

class WeatherIterable(Iterable):
    """
    可迭代对象
    """

    def __init__(self, cites):
        self.cites = cites

    def __iter__(self):
        return WeatherIterator(self.cites)

if __name__ == '__main__':
    # 查询的城市
    cites = ['长沙', '深圳', '株洲', '衡阳', '昆明']
    # 实现实时查询
    for x in WeatherIterable(cites):
        print(x)