Python的一些进阶学习-2017.08.14

首先应该先理解几个东西:

L=[1,2,3,4,5]
for i in l :
    print i 
#这里的l就是一个可迭代对象, 其实迭代过程是调用l.__inter__接口,
p= iter(l)
    #这里的p就是一个迭代器对象, p.next 进行迭代访问直到访问完

其次,标准库collections 里面有两个超好用的Iterable,Iterator 的类 分别对应到可迭代对象和迭代器对象

  In [2]: Iterable.__abstractmethods__
  Out[2]: frozenset({'__iter__'})

  In [3]: Iterator.__abstractmethods__
  Out[3]: frozenset({'next'})

其实个人理解可迭代器对象 其实就是对象为可迭代的字符串,列表的数据类型, 而迭代器对象就是指的对象为迭代对象,拥有next的方法去迭代对象;

话不多说,来个小案例 ,通过抓取某网站的天气预报,依次显示所需信息。要求为一次抓取所需城市的天气再显示,会有很高的延时,且浪费存储空间,但是如果用“用时访问”的策略,将所有的需要的城市的气温封装到一个对象里,用for去迭代:

   from collections import Iterable,Iterator
   class weatheriterator(Iterator):
     #构造一个迭代器
  def __init__(self,cities):
         self.cities=cities
         #记录迭代的位置
         self.index= 0
  def get_weather(self,city):
         r= requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)
         data = r.json()['data']['forecast'][0]
         return '%s:%s,%s'%(city,data['low'],data['high'])

 #迭代器对象需构造next方法
    def next(self):
         if self.index==len(self.cities):
             raise StopIteration
             city = self.cities[self.index]
             self.index +=1
         return self.get_weather(city)

  class weatheriterable(Iterable):
   #构造一个可迭代对象
   def __init__(self,cities):
         self.cities= cities

   def __iter__(self):
         return weatheriterator(self.cities)

 #构造一个实例
 for x in weatheriterable([u'北京',u'上海',u'广州',u'杭州',u'南通']):
     print x

hadoop@ubuntu:~/pyfile$ python iterato.py
北京:低温 25℃,高温 36℃
上海:低温 29℃,高温 37℃
广州:低温 26℃,高温 32℃
杭州:低温 28℃,高温 38℃
南通:低温 26℃,高温 34℃

简单的通过request爬了天气,再通过建立迭代器和可迭代对象来迭代访问抓取数据~

你可能感兴趣的:(python)