您的位置:首页 > 编程语言 > Python开发

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

2017-07-26 06:48 549 查看
什么是可迭代对象?

列表、字符串

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: