【Python】迭代器和生成器
·
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__() 的细节。
更多推荐

所有评论(0)