列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器都有一个共同的特性,都支持使用 for 循环遍历存储的元素,都是可迭代的,因此它们又有一个别称,即迭代器。
迭代器指的就是支持迭代的容器,更确切的说,是支持迭代的容器类对象,这里的容器可以是列表、元组等这些 Python 提供的基础容器,也可以是自定义的容器类对象,只要该容器支持迭代即可。
自定义一个序列类,但该序列类对象并不支持迭代,因此还不能称之为迭代器。如果要自定义实现一个迭代器,则类中必须实现如下 2 个方法:
1、 __next__(self):
返回容器的下一个元素。
2、__iter__(self):
该方法返回一个迭代器(iterator)。
Python 内置的 iter() 函数也会返回一个迭代器,该函数的语法格式如下:
iter(obj[, sentinel])
其中,obj 必须是一个可迭代的容器对象,而 sentinel 作为可选参数,如果使用此参数,要求 obj 必须是一个可调用对象。
可调用对象,指的是该类的实例对象可以像函数那样,直接以“对象名()”的形式被使用。通过在类中添加 __call__() 方法
,就可以将该类的实例对象编程可调用对象。
iter() 函数第 2 个参数的作用,如果使用该参数,则要求第一个 obj 参数必须传入可调用对象(可以不支持迭代),这样当使用返回的迭代器调用 __next__()
方法时,它会通过执行 obj() 调用 __call__()
方法,如果该方法的返回值和第 2 个参数值相同,则输出 StopInteration 异常;反之,则输出 __call__()
方法的返回值。