迭代器与可迭代对象
简述
迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一
种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器
模式
迭代器
迭代器是这样一个对象,实现了无参数__next__方法,返回序列中的下一个元素,
如果没有元素了,那么抛出StopIteration异常。
迭代器特性
迭代器对象为一次性消费,用完不可再生,
如果要再使用,需要重新获取迭代器;
此外,两个迭代器之间无干扰。
栗子
list1 = [1, 2, 3, 4, 5] it1 = iter(list1) print(next(it1)) #1 print(next(it1)) #2 print(" for loop") for x in it1: print(x) #3 #4 #5 print(" No interference between two iters") it2 = iter(list1) it3 = iter(list1) print(next(it2)) #1 print(next(it3)) #1 print(next(it2)) #2 print(next(it3)) #2
迭代器的作用
(1)for循环
(2)构建和扩展集合类型
(3)逐行遍历文本文件
(4)列表推导、字典推导和集合推导
(5)元组拆包
(6)调用函数时,使用*拆包实参
可迭代对象
如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。
根据可迭代协议,__iter__ 方法实例化并返回一个迭代器,
Python 中的迭代器还实现了__iter__ 方法,因此迭代器也可以迭代。
python迭代对象的流程
在对一个可迭代对象迭代时,具体流程如下
(1) 检查对象是否实现了 __iter__ 方法,如果实现了就调用它,获取一个迭代器
(2)如果没有实现 __iter__ 方法,但是实现了 __getitem__ 方法,
python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素
(3)如果尝试失败,python 抛出 TypeError 异常,通常会提示"x object is not iterable"
迭代器与可迭代对象的关系
python是通过可迭代对象来获取迭代器的。
实际应用
(1)实现一个迭代器对象WeatherIterator,__next__每次返回一个城市的气温信息
(2)实现一个可迭代对象WeatherIterable,__iter__方法返回一个WeatherIterator对象
代码
from collections import Iterable, Iterator import requests class WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0 def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.get_weather(city) def get_weather(self, city): url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + city r = requests.get(url) data = r.json()['data']['forecast'][0] return city, data['high'], data['low'] class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) def show(w): for x in w: print(x) w = WeatherIterable(['北京', '上海', '广州'] * 10) show(w)
参考资料:《流畅的python》
参考资料:python3实用编程技巧进阶