迭代器的简要概述
迭代器的简要概述
在说迭代器之前我们先来看一下以下的代码:
for element in iterable
在我们之前学习的for循环中,实际上就是从迭代器中一个一个地拿元素。
我们注意到,在python中有许多类型的对象可以被定义为可迭代的。基本容器类型,如列表、元组和集合,都可以被定义为迭代类型。此外,字符串也可以产生它的字符迭代,字典可以生成它的键的迭代,文件可以产生它的行的迭代。用户自定义类型也可以迭代。在python中,迭代器的机制基于以下的规定:
-
迭代器是一个对象,通过一系列的值来管理迭代。如果
i
定义为一个迭代器对象,那么每次调用内置函数next(i)
,都会从当前的序列中产生一个后续的元素;如果没有后续的元素了,那么就会抛出一个StopIteration
异常。 -
对象
object
是可迭代的,那么通过语法iter(object)
可以产生一个迭代器。通过这些定义,
list
的实例是可迭代的,但是它本身不是一个迭代器。比如data = [1,3,5,7]
调用next(data)
是非法的。只有通过i = iter(data)
则可以产生一个迭代器对象,然后调用next(i)
将返回列表中的元素。python中的for
循环语法就是使这个过程自动化,为可迭代对象创造了一个迭代器,然后反复调用下一个元素知道捕获StopIteration
异常。提示:迭代器通常是间接引用回到初始的元素维护其状态。比如,对列表实例调用
iter(data)
会产生一个list_iterator
类的一个实例。迭代器不存储自己列表的元素。相反,他保存原始列表的当前索引,该索引指向下一个元素。因此,如果原始列表的内容在迭代器构造之后但在迭代完成之前被修改,迭代器将报告原始列表的更新内容。
# 例子
data = [1,3,5,7]
for i in data:
data.pop()
print(data) #[1,3]