迭代器

1.该对象需提供next方法,返回迭代器的下一项

2.如果没有下一项即迭代完成时会抛出一个StopIteration异常。

list1 = [1,2,3]
iter1 = iter(list1)
iter2 = iter(list1)
for i in iter1:print("迭代器1:",i)
print("迭代器2",next(iter2))
for i in iter2:print("迭代器2:",i)

 

 总结:

我们for循环列表字典等,并不是真正的for循环列表本身。而是for循环他们返回的一个迭代器对象,这些迭代器对象只能迭代一次

事实上除了for外,sum,min,max函数等内置对象都会使用迭代器协议访问对象。也就是说他们会先调用这些对象中的__iter__方法,如果没有的话则会去找__getitem__方法

生成器

def test_generator(n):
    for i in range(n):
        yield i ** 2
generator1 = test_generator(3)
generator1
next(generator1)

1.生成器本身是一种特殊的迭代器,也就是说生成器就是迭代器。

2.生成器会自动实现迭代器协议,也就是说只要我们yield后,自动就生成了next对象包括StopIteration等结构。

3.生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。

二者区别

1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是自己生成元素的。也就是前者是从有到有的复制,而后者则是从无到有的生成。

2.在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。

如果到这里还是不太清楚,那我们就再研究深入一点

list1 = list(dir(generator1)) # 生成器所有的方法
list2 = list(dir(iter([1,2,3]))) # 迭代器所有的方法

  

 

 posted on 2023-01-16 11:51  boye169  阅读(32)  评论(0编辑  收藏  举报