Appearance
迭代器
可迭代对象负责提供迭代器;迭代器负责逐个产出值。
iter(obj):从可迭代对象取得迭代器。next(it):取得下一个值;耗尽时抛出StopIteration。for x in obj会自动重复调用这两个步骤。
迭代器会被消耗。可迭代对象每次调用 iter() 应返回新的迭代器,才能从头重复遍历。
手写迭代器
数据容器不保存遍历位置;迭代器保存游标。这样多个迭代器互不影响:
py
import re
WORD_RE = re.compile(r'\w+')
class Sentence:
def __init__(self, text: str) -> None:
self.text = text
self.words = WORD_RE.findall(text)
def __iter__(self):
return SentenceIterator(self.words, 0)
class SentenceIterator:
def __init__(self, words: list[str], index: int) -> None:
self.words = words
self.index = index
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.words):
raise StopIteration
result = self.words[self.index]
self.index += 1
return result
s = Sentence("Hi ice, Hello World!")
it1 = iter(s)
# for word in s:
# print(word)
# for word in s:
# print(word)
for word in it1:
print(word)
for word in it1:
print(word)SentenceIterator.__iter__() 返回自身,因为它已经是迭代器;Sentence.__iter__() 返回新的 SentenceIterator,因为它是可重复遍历的数据容器。