在实际生产中,对于某些对象,需要执行一些相同的处理步骤,即循环处理某些对象。在 Python 中,把这些对象的集合定义成一个迭代器,通过这个迭代器可以逐个访问这些对象。即:使用迭代协议实现循环处理的操作。
Python 中的迭代协议是指:迭代器(迭代器也是一个对象)必须提供 方法,在执行该方法的时候前进到下一个结果,而在一系列结果的末尾时,则会引发 StopIteration 异常。
还有一些专门处理迭代器的处理工具,这些迭代工具从右往左扫描迭代器,逐次执行迭代器中的各个结果对象。迭代工具包括:for 循环、列表解析、in 成员关系测试以及 map 内置函数等。
有哪些迭代器?
文件迭代器
zip、map、filter 内置迭代器
函数构建迭代器
类构建迭代器
可迭代对象(list)如何使用迭代工具
文件迭代器
为什么把文件设计成迭代器呢?因为,通常我们操作文件的方法都是一次性把文件的所有内容加载到内存当中,然后再进行相关的处理。但是,有的文件会很大,严重占用内存,特别是一些性能比较差的机器(你不能保证每台机器都配置高性能的硬件),可能因为内存的不足,导致程序的无法工作。而把文件设计成迭代器,每次只从文件中取一行的数据,大大减少内存的压力。
执行迭代器的方式有两种:手动迭代和循环迭代。
手动迭代
若继续执行 ,将会引发 StopIteration 异常。 、 和 三种操作结果相同。
循环迭代
for 循环会从 fid 迭代器中每次提取一行的数据(实际是执行 ,并把结果赋值给 line ),直至循环所有的行。那为什么 for 循环没有跑出 StopIteration 异常?这是因为迭代器在执行可迭代对象的时候,只要监测到 StopIteration 异常,就会跳出循环,但是并不会抛出这个异常。
zip、map、filter 内置迭代器
实际上 zip、map、filter 应该算是迭代工具,它们都使用了迭代协议。只是在调用这些方法后会返回一个迭代器,所以称它们是迭代器,也是迭代工具。
还有一个 range 对象,它也使用了迭代协议,只是返回的 range 对象并没有 方法。所以 range 只是迭代工具,并不是迭代器。
函数构建迭代器
函数构建后的迭代器叫做生成器,生成器中通过 yield 关键字来控制函数的执行。
例子中的 data 是一个迭代器(生成器),通过执行 开始执行函数,等到达 yield 表达式时,函数暂停,返回表达式的值。直到迭代器再次执行 ,函数会继续执行。
类构建迭代器
类中通过定义 , 两个方法,来构建迭代器。
创建一个 Person,把类的 id 设置成迭代器
可迭代对象如何使用迭代器
有一种对象,它们没有 方法,但是它们可以使用迭代工具进行迭代。像列表、元祖和字符串这些序列化对象,这些对象被称为可迭代对象。
当循环开始的时候,程序会调用 iter 内置函数,把 [1, 2, 3] 列表对象转化成迭代器,然后进行迭代循环处理。
字典也可以迭代循环,只是字典迭代循环的是它的 key
领取专属 10元无门槛券
私享最新 技术干货