Python中级基础系列3.6(五)之——可迭代对象Itertable&&可迭代器Iterator实例介绍

浏览: 1911

实例介绍

继承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)

执行结果:

Clipboard Image.png


总结

实现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.励志英文听力素材,每夜轻听。

黑胡子: 人的梦想,永远不会结束!

推荐 1
本文由 粽子job 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册