迭代器(iterator)是访问集合内元素的一种方式,提供了一种遍历类序列对象的方法。从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。对于字典、文件、自定义对象类型等,可以自定义迭代方式,从而实现对这些对象的遍历。总之,迭代器就是定义了对对象进行遍历的方式。
凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
python提供了一个iter函数用来生成迭代器。这个方法有两个参数,当只有一个参数的时候,若这个参数是一个容器,则返回这个容器的迭代器对象,若这个参数本身就是一个迭代器,则返回其自身。
lst = [10, 20, 30, 40]
it = iter(lst)
print it
it2 = iter(it)
assert id(it) == id(it2)
for 与 迭代器 的比较:
名称 | 计数方法 | 异常情况 | 优点 | 缺点 | 联系 |
---|---|---|---|---|---|
for | 通过索引 | 无 | 保留了索引 | 不适合遍历特别巨大的集合 或 无法随机访问的数据结构(比如set) | for循环本质上就是通过不断调用next()函数实现的 |
迭代器 | 每次迭代指针会指向下一个元素的位置 | StopIteration | 惰性求值,适合遍历特别巨大的集合 或 无法随机访问的数据结构(比如set) | 丢失了索引(但可用enumerate()解决),且不能回退 |
lst = [10, 20, 30, 40]
for x in lst:
pass
等价于:
it = iter([10, 20, 30, 40])
while True:
try:
x = next(it) # 或者 x = it.next()
except StopIteration:
break
迭代器
和 enumerate()
相结合:
for idx, ele in enumerate(lst):
print idx, ele