1. 迭代器(Iterator)

定义:迭代器是遵循迭代协议(Iterator Protocol)的对象,用于逐个访问集合中的元素,无需提前加载所有元素到内存。

  • 必须实现两个方法:
    • __iter__():返回迭代器对象本身(用于支持 for 循环)。
    • __next__():返回下一个元素,当没有元素时触发 StopIteration 异常。

特点:

  • 惰性计算:只在需要时生成下一个元素,节省内存。
  • 单向访问:只能向前迭代,不能回溯。
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self  # 返回自身作为迭代器

    def __next__(self):
        if self.index < len(self.data):
            value = self.data[self.index]
            self.index += 1
            return value
        raise StopIteration  # 迭代结束

# 使用迭代器
iter_obj = MyIterator([1, 2, 3])
for item in iter_obj:
    print(item)  # 输出:1 2 3

2. 生成器(Generator)

定义:生成器是一种特殊的迭代器,无需手动实现 __iter__() 和 __next__() 方法,而是通过 yield 关键字自动生成迭代器协议。

  • 有两种形式:
    • 生成器函数:包含 yield 语句的函数,调用时返回生成器对象。
    • 生成器表达式:类似列表推导式,用 () 包裹,返回生成器对象。

特点:

  • 简化迭代器实现:无需手动管理状态(如 index),yield 会暂停函数并保存当前状态。
  • 同样支持惰性计算,适合处理大数据流或无限序列。
# 生成器函数
def my_generator(data):
    for item in data:
        yield item  # 每次返回一个元素并暂停

gen = my_generator([1, 2, 3])
for item in gen:
    print(item)  # 输出:1 2 3

# 生成器表达式
gen_expr = (x * 2 for x in [1, 2, 3])
print(list(gen_expr))  # 输出:[2, 4, 6]
  • 当你定义一个包含 yield 关键字的生成器函数时,调用该函数会返回一个生成器对象。
  • 这个生成器对象内置了 __iter__() 方法(返回自身)和 __next__() 方法(负责执行函数直到遇到 yield 并返回值,或触发 StopIteration 结束迭代)。
  • 因此,生成器完全符合迭代器的定义,可以直接用于 for 循环、next() 函数等迭代场景,行为与迭代器一致。

简单讲:生成器是迭代器的简化实现,它通过 yield 关键字自动完成了迭代器所需的状态管理和方法实现,让开发者无需手动处理 __iter__() 和 __next__() 的细节。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐