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)

 

posted @ 2018-11-17 21:16  海予心  阅读(133)  评论(0编辑  收藏  举报