实例介绍
继承Iterator迭代器和Iteratable可迭代对象,实现天气预报信息的迭代器(WeatherIterator)和可迭代对象(WeatherIterable)。
原理介绍
原理示例:for循环迭代
list=[a,b,c,d]
for x in list # list是可迭代对象,在此处用iter(list)把list变成可迭代器iterator,再调用迭代器的next()方法
print(x)
原理剖析:for循环迭代的过程
>>> list = [a,b,c,d]
>>> iter_tor = iter(list)
>>> iter_tor.next()
a
>>> iter_tor.next()
b
>>> iter_tor.next()
c
>>> iter_tor.next()
d
>>> iter_tor.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
实例实现
import requests
from collections import Iterable,Iterator
class WeatherIterator(Iterator): #天气迭代器继承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)
# print(r.text)
data=r.json()['data']['forecast'][0] # 请求得到的是json文件,利用json()解析内容
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.getWeather(city)
class WeatherIterable(Iterable): # 天气可迭代对象继承Iterable
def __init__(self,cities):
self.cities=cities
def __iter__(self):
return WeatherIterator(self.cities) # 返回天气迭代器
for x in WeatherIterable([u'北京',u'上海',u'广州',u'咸宁']):
print(x)
执行结果:
总结
实现for循环迭代关键两点:
一,iter()
二,next()
实例的末尾 for x in WeatherIterable([u'北京',u'上海',u'广州',u'咸宁']),其实可以直接用WeatherIterator([u'北京',u'上海',u'广州',u'咸宁'])替代,一样可以得出正确的结果。因为WeatherIterator继承了Iterator,因此就算WeatherIterator没有定义__iter__()方法,但是默认调用了父类Iterator的__iter()__方法,把可迭代对象参数变成迭代器参数,再调用定义好的__next__()。
帮助信息
Iterator迭代器:__iter__():__next__():
任何具有__next__()
方法的对象都是迭代器,对迭代器调用next()方法可以获取下一个值。
Iterable可迭代对象:
大部分容器都是可迭代的,但是还有其他一些对象也可以迭代,例如:文件对象以及管道对象等等,容器一般来说存储的元素是有限的
可迭代对象可以为任意对象,不一定非得是基本数据结构,只要这个对象可以返回一个iterator。
介绍个公众号“IT海贼船”,觉得主题内容都不错,是个认真做内容的公众号。喜欢的可以关注下。
海贼船内容(绝对干货)
A.职业规划,工作,面试经验分享。
B.每周不定期更新相关案例项目详解文章。
C.视频文档资源共享。
D.励志英文听力素材,每夜轻听。
黑胡子:“ 人的梦想,永远不会结束!”