python-迭代器与可迭代对象

迭代器与可迭代对象

简述

迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一
种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器
模式

迭代器

迭代器是这样一个对象,实现了无参数__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实用编程技巧进阶

原文地址:https://www.cnblogs.com/marton/p/10778409.html