迭代器和生成器

发布时间 2023-06-02 15:07:46作者: 凡人半睁眼

一、迭代器(Iterator)

1、可迭代对象(Iterable)

存储了元素的一个容器对象,且容器中的元素可以通过“__iter__( )”方法或“__getitem__( )”方法访问。可迭代对象不能独立进行迭代,可通过“for…in”遍历来完成

2、常见的可迭代对象

字符串、列表、元组、字典、集合、文件

3、迭代器对象

可迭代对象调用__iter__( )方法成为迭代器对象,迭代器对象是可以记住遍历的位置的对象。

4、迭代器特性

  1. 迭代器对象可以使用iter()函数来创建。

  2. 迭代器对象可以使用next()函数来访问容器中的元素。

  3. 当迭代器对象遍历完容器中的元素时,它将引发StopIteration异常。

  4. 可以使用for循环来遍历迭代器对象,因为for循环自动处理了StopIteration异常。

  5. 迭代器对象在遍历过程中只能向前移动,不能后退或重置。

  6. 迭代器对象可以被多个迭代器同时使用,每个迭代器都会维护自己的迭代状态。

  7. 生成器对象是一种特殊的迭代器,它们可以使用yield语句来定义。

  8. 迭代器对象可以用于惰性计算,即只有在需要时才计算下一个元素,从而节省内存和计算资源。

  9. 迭代器其实是一种不依赖于索引取值的方式!

5、易混淆

ll = [1, 2, 3, 4]

# StopIteration 当数据被取值完的时候,如果在次next会直接报错
res = ll.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())  

# 取出来的值都是 1,因为每次打印都调用的ll.__iter__方法,数据被重置
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1

 

 

 

 

 

二、生成器

 

 

 

 

三、异常捕获