跳转至

Python的迭代器(Iterator)

迭代是Python最强大的功能之一,是常用的访问集合元素的一种方式。可以被next()函数调用并不断返回下一个值的对象。迭代器是一个可以记住遍历的位置的对象。Iterator对象表示的是一个数据流, 可以被看作为一个有序序列,但是不能提前得到它的长度,只有在需要返回下一个数据时它才会计算, 它可以被next()。函数调用并不断返回下一个数据,直到没有数据时抛出Stopiteration错误。

迭代器有以下几个特点:

  1. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  2. 迭代器有两个基本的方法:iter()和next()
  3. 可以直接作用于fbr循环的对象是可迭代的(Iterable)对象。字符串、列表、字典、集合或元组 对象都是可迭代对象,都可用于创建迭代器。另外,生成器(generator)也属于可迭代对象。如果一个对象是迭代器,那么这个对象肯定是可迭代的;但是反过来,如果一个对象是可迭代的, 那么这个对象不一定是迭代器。如何知道一个对象是否可迭代呢?方法是通过collections模块的 Iterable类型判断
from collections import Iterable
print(isinstance('abc',Iterable)) # str 是否可迭代 
print(isinstance([1,2,3],Iterable)) # list 是否可迭代 
print(isinstance(123,Iterable)) # 整数是否可迭代 
print(isinstance((1,2),Iterable)) # 元组是否可迭代 
print(isinstance({1,2},Iterable)) # 集合是否可迭代

运行结果:

True
True
False
True
True

下面使用list来创建一个可迭代对象:

list=[1,2,3,4]
it=iter(list) #创建迭代器对象
for x in it:
    print (x, end="")

运行结果:

1234

定义一个 __iter__() 方法来返回一个带有 [__next__()] 方法的对象。 如果类已定义了 __next__(),则 __iter__() 可以简单地返回 self:

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

>>>

>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
...     print(char)
...
m
a
p
s