python's docs

2.2.0 如何创建一个可迭代对象


0. 创建可迭代对象的条件

  • 首先需要一个迭代器,拥有一个next方法(python2)
  • 其次需要有一个对象,拥有一个iter方法,返回上面的迭代器

下面以一个城市天气查询结果程序为例


1. 第三方包工具

为了实现上面的目标,我们可以使用collections的Iterable和Iterator

# 这两个对象的抽象接口如下
In [27]: from collections import Iterable, Iterator

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

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

从上面两个对象的抽象接口,我们就可以看出:
Iterable是用来构造迭代对象的
Iterator是用来构造迭代器的


2. 迭代对象示例-城市天气查询系统

#!/usr/bin/python
# _*_ coding: utf-8 _*_

import requests
from collections import Iterable, Iterator


class WeatherIterator(Iterator):
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def getWeather(self, city):
        r = requests.get("http://wthrcdn.etouch.cn/weather_mini?city=" + city)
        data = r.json()['data']['forecast'][0]
        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):
    def __init__(self, cities):
        self.cities = cities

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


if __name__ == "__main__":
    cities = [u'北京', u'上海', u'广州', u'深圳']
    for x in WeatherIterable(cities):
        print x

执行过程

python getWeather.py
北京: 低温 -4℃, 高温 5℃
上海: 低温 4℃, 高温 10℃
广州: 低温 17℃, 高温 23℃
深圳: 低温 16℃, 高温 23℃