class SquaredGenerator:
def __init__(self, n):
self.n = n
self.current = 1
def __iter__(self):
return self
def __next__(self):
if self.current > self.n:
raise StopIteration
result = (self.current, self.current ** 2)
self.current += 1
return result
# 使用示例
n = 5
generator = SquaredGenerator(n)
for number, square in generator:
print(f"数字: {number}, 平方: {square}")
技术点说明
- 迭代器协议:实现了
__iter__
和 __next__
方法,使得对象可以作为迭代器使用。__iter__
方法返回迭代器对象本身,__next__
方法返回下一个值。
- 状态管理:在类中定义了
self.current
来记录当前生成到哪个数字,每次调用 __next__
时更新这个状态,当 self.current
超过 n
时,抛出 StopIteration
异常表示迭代结束。
另一种使用生成器函数实现的方式
def squared_generator(n):
for i in range(1, n + 1):
yield (i, i ** 2)
# 使用示例
n = 5
for number, square in squared_generator(n):
print(f"数字: {number}, 平方: {square}")
技术点说明
- 生成器函数:使用
yield
关键字定义一个生成器函数,每次迭代时生成一个包含数字及其平方的元组。
- 状态管理:生成器函数内部使用
for
循环隐式地管理状态,每次循环时更新 i
的值,直到 i
达到 n + 1
循环结束,生成器自动停止迭代。