关于迭代器
s = "abc"
for x in s:
print(x)
在执行类似 for x in s 这样的语句时,Python 实际上会调用 iter(s)。内置的 iter 函数又会调用 s.__iter__
这个特殊方法。该方法必须返回迭代器对象,而那个迭代器 本身,则实现了名为 __next__
的特殊方法。此后,for 循环会在迭代器对象上面反复调 用内置的 next 函数,直至其耗尽并产生 StopIteration 异常。
-
可迭代
在类里面的
__iter__
内实现生成器,就能实现可迭代。 -
迭代器
在类里面的
__iter__
内实现返回迭代器对象,这个迭代器对象需要实现__next__
和next方法, 并且在迭代器对象上面反复调用 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]
# []