什么是可迭代对象?
列表、字符串
for循环的本质?
for循环要确保in后面的对象为可迭代对象,如何确保?
iter() 方法得到一个迭代器对象
不停.__next__() 方法对迭代器对象进行迭代,直到捕获StopIteration异常跳出循环
为啥列表和字符串可以迭代?
满足了一种接口,.__iter__(),__getitem__()
iter() 去找.__iter__(),__getitem__(),没找到则为不可迭代
迭代器对象只有一个__next__()方法,都迭代完毕,抛出一个异常
如何实现这个案例?
某软件要求,从网络抓取个城市的气温信息,并依次显示:
北京: 15~20
天津: 17~22
长春: 12 ~18
...
出现一个问题,如果一次抓取所有城市信息再显示,会有很大的延迟,并浪费存储空间,用户体验并不好
如何解决这个问题?
- 实现一个迭代器对象,next方法返回每一个城市天气
- 实现一个可迭代对象,__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)