1. 本章核心概念

迭代器(Iterator)

  • 可以记住遍历位置的对象
  • 从集合第一个元素开始访问,直到结束
  • 只能前进,不可后退
  • 依赖两个方法:iter()、next()
  • 字符串、列表、元组等都可以创建迭代器

生成器(Generator)

  • 使用 yield 的函数
  • 本质上是迭代器
  • 每次执行到 yield 会暂停,下次从暂停处继续
  • 按需生成值,节省内存
  • 适合大量数据或无限序列

2. 关键语法与机制

iter()

  • 将可迭代对象转换为迭代器
  • 示例:it = iter([1,2,3])

next()

  • 获取迭代器的下一个值
  • 若无更多元素 → 抛出 StopIteration

StopIteration

  • 用于标识迭代结束
  • 自定义迭代器时必须手动抛出

yield

  • 暂停函数执行并返回值
  • 下次迭代从暂停处继续
  • 生成器函数必须包含至少一个 yield

3. 示例代码(可直接运行)

示例 1:基础迭代器

list = [1, 2, 3, 4]
it = iter(list)
print(next(it))
print(next(it))

示例 2:for 遍历迭代器

list = [1, 2, 3, 4]
it = iter(list)
for x in it:
    print(x, end=" ")

示例 3:while + try/except

import sys
list = [1, 2, 3, 4]
it = iter(list)
while True:
    try:
        print(next(it))
    except StopIteration:
        sys.exit()

示例 4:自定义迭代器

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

myiter = iter(MyNumbers())
print(next(myiter))
print(next(myiter))

示例 5:限制次数并触发 StopIteration

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 20:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration

for x in MyNumbers():
    print(x)

示例 6:生成器函数(倒计时)

def countdown(n):
    while n > 0:
        yield n
        n -= 1

generator = countdown(5)
print(next(generator))
print(next(generator))
print(next(generator))

for value in generator:
    print(value)

示例 7:生成器实现斐波那契

import sys

def fibonacci(n):
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        counter += 1

f = fibonacci(10)
while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

4. 常见错误与坑

  • 忘记处理 StopIteration
  • 生成器只能遍历一次
  • 在生成器中混用 return 和 yield
  • 自定义迭代器忘记抛出 StopIteration
  • 误以为生成器会一次性生成所有数据

5. 实战应用场景

  • 大文件逐行读取
  • 无限序列
  • 数据流处理(pipeline)
  • 异步编程基础(yield from → asyncio)

更多推荐