什么是迭代器,Python迭代器及其用法

前面介绍了使用 for 循环遍历列表、元组和字典等,这些对象都是可迭代的,因此它们都属于迭代器。迭代器其实就是一个实现了迭代器协议的容器类对象。

简单的理解容器,就是用来存放各种元素的,是各种元素的集合。常用的容器包括元组、列表、字典、集合等。

迭代器基于以下两个方法实现:
  1. __next__(self):返回容器的下一个元素。
  2. __iter__(self):该方法返回一个迭代器(iterator)。

迭代器可以利用 Python 内置的 iter() 函数和一个序列来创建。例如:
# 将列表转换为迭代器
my_iter = iter([2, 'fkit', 4])
# 依次获取迭代器的下一个元素
print(my_iter.__next__())
print(my_iter.__next__())
print(my_iter.__next__())
print(my_iter.__next__())
运行结果为:

2
fkit
4
Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\demo.py", line 7, in <module>
    print(my_iter.__next__())
StopIteration

可以看到,当遍历完序列之后如果继续遍历,会引发 StopIteration 异常,这样迭代器就可以与循环兼容,因为可以捕获这个异常并停止循环。例如:
for i in iter([2, 'fkit', 4]):
  print(i,end=" ")
运行结果为:

2 fkit 4


Python 也允许我们自定义一个迭代器,只需要实现 __next__() 和 __iter__() 特殊方法即可。例如:
class countDown:
  def __init__(self,step):
    self.step = step
  def __next__(self):
    if self.step <= 0:
      raise StopIteration
    self.step -= 1
    return self.step
  def __iter__(self):
    return self
for element in countDown(10):
  print(element,end=" ")
输出结果为:

9 8 7 6 5 4 3 2 1 0


迭代器本身是一个底层的特性和概念,在程序中并不常用,但它为生成器这一更有趣的特性提供了基础。

有关生成器的相关知识,会在后续章节中介绍。