python迭代器与生成器
本章主要讲述可迭代对象、迭代器和生成器。
一、定义
可迭代对象:内部实现了__iter__方法的都可成为可迭代对象;字符串、列表、集合、元组、字典均是可迭代对象;
迭代器:拥有__iter__方法和__next__方法;迭代器是为了为非序列数据类型(如字典、集合、文件对象)提供遍历的方法,迭代器均用__next__获取下一个值(for循环遍历就是调用的该方法)。
生成器:带有yield的函数执行得到的结果;本质上是一种迭代器。
二、特点
使用迭代器的优点:
1. 提供一种不依赖于索引的取值方式。迭代器通过__next__方法取值
2. 惰性计算,节省内存空间。迭代器每执行__next__方法一次,则“动作”一次,返回一个元素。就像懒驴似的,我们踹一脚,这懒驴(迭代器)才走一步,不踹不动弹。
迭代器的缺点:
1. 取值不如索引方便。要每次执行__next__方法取值。
2. 迭代过程不可逆。也就是说这个懒驴(迭代器的迭代过程)走的是一条通往悬崖的路,每次执行__next__方法返回结果的同时都会向悬崖靠近一步。直到跳下悬崖(迭代完毕,抛出StopIteration异常)。所以说,迭代过程是无法回头的,只能一条路走到黑。
3. 无法获取迭代器的长度。因为可迭代对象通过__iter__方法返回的是迭代器(内存地址)。所以,我们无法获取这个迭代器内的元素有多少。
三、关系
生成器一定是迭代器,迭代器不一定是生成器
四、代码及实例
from collections import Iterator,Generator lst1=[1,2,3,5] print(iter(lst1)) dic={'k':'v'} print(dic.__iter__()) def func(): yield 1 print(func) g= func() print(g) print(isinstance(g,Iterator)) print(isinstance(g,Generator)) #执行结果 # <list_iterator object at 0x000000208> # <dict_keyiterator object at 0x0000728> # <function func at 0x0000008> # <generator object func at 0x0000258> # True # True
编程代码实现文件写入的实时监控
def monitor_file(filename): with open(filename) as f: f.seek(0,2) while True: line = f.readline() if not line: continue yield line l_content=monitor_file("info1.txt") for i in l_content: print(i)