关于迭代器

s = "abc"

for x in s:
    print(x)

在执行类似 for x in s 这样的语句时,Python 实际上会调用 iter(s)。内置的 iter 函数又会调用 s.__iter__ 这个特殊方法。该方法必须返回迭代器对象,而那个迭代器 本身,则实现了名为 __next__ 的特殊方法。此后,for 循环会在迭代器对象上面反复调 用内置的 next 函数,直至其耗尽并产生 StopIteration 异常。

迭代器、生成器多次迭代的问题

迭代器、生成器第一次迭代完成后,第二次迭代会获取不到数据

                  # 关于迭代器
s = "abc"         
i = iter(s)       # 获取迭代器对象
print(list(i))
print(list(i))

# ['a', 'b', 'c']
# []
                  # 关于生成器
s = "abc"
t = (x for x in s)
print(list(t))
print(list(t))


# ['a', 'b', 'c']
# []

实现可迭代对象


class Test(object):
  
    def __init__(self):
        self.num = 5
        
    def __iter__(self):
        i = 0
        while i < self.num:
            yield i
            i += 1


test = Test()
print(list(test))

i = iter(test)  # 获取迭代器对象
print(list(i))
print(list(i))


# [0, 1, 2, 3, 4]
# [0, 1, 2, 3, 4]
# []