Python可迭代对象和迭代器

在Python中可以直接作用于for语句的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

为什么list、dict、str等数据类型不是Iterator?

这是因为Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

概括

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

可迭代对象和迭代器具体案例

要求:
从网络抓取各个城市气温信息,并依次显示.
用“用时访问”策略,并且把所有城市气温封装到一个对象里,可用for语句进行迭代。

解决方案:

  1. 实现一个迭代器对象WeatherIterator, next方法每次返回一个城市气温.
  2. 实现一个可迭代对象WeatherIterable, iter方法返回一个迭代器对象.
import requests
import urllib
import json
from collections import Iterable, Iterator


class WeaterIterator(Iterator):

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

    def getWeather(self, city):
        base_url = 'http://v.juhe.cn/weather/index?format=2&cityname={0}&key=3d3380ac5456bf5bbafb431b152f14b8'
        url = base_url.format(urllib.parse.quote(city))
        res = requests.get(url)
        json_obj = json.loads(res.text)
        message = '{0} 当前温度:{1}摄氏度'
        return message.format(json_obj['result']['today']['city'], json_obj['result']['sk']['temp'])

    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 WeaterIterator(self.cities)
for x in WeatherIterable(['北京','天津','天长','重庆']):
    print(x)
北京 当前温度:26摄氏度
天津 当前温度:23摄氏度
天长 当前温度:25摄氏度
重庆 当前温度:26摄氏度

   转载规则


《Python可迭代对象和迭代器》 阮福民 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Vimium快捷键 Vimium快捷键
复制一段链接:经常在网页上看到一段链接文字,但却是不可点的。原来你需要先复制,然后新建标签页,再粘贴,敲回车后才能打开。现在呢?你只需要把要打开的链接复制一下,直接按「p」或「P」就可以打开了,小写的 p 是在当前标签页打开,大写的 P 则
2019-10-25
下一篇 
2019-09-13随笔 2019-09-13随笔
赶紧让我工作吧,目前的生活太堕落了,和废人一样。每天都在得过且过和要好好努力之间辗转,心脏有点受不了。 突然明白之前为什么能好好学习编程,当时本质上还是有压力的。然后考试结束后,却进入了无压力放飞自我的状态,本以为没有压力是自己所追求的方向
2019-09-13
  目录