Skip to content

迭代器

可迭代对象负责提供迭代器;迭代器负责逐个产出值。

  • 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,因为它是可重复遍历的数据容器。