MST

星途 面试题库

面试题:如何自定义一个符合特定迭代协议的生成器

假设你需要创建一个生成器,该生成器能够按照特定顺序(如斐波那契数列顺序)生成数据,并且要支持在迭代过程中通过外部调用暂停、恢复以及修改生成器的内部状态。请详细说明设计思路,并给出完整的Python代码实现。
47.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 生成器实现特定顺序生成数据:以斐波那契数列为例,在生成器函数中使用两个变量记录前两个数,不断计算并生成下一个数。
  2. 支持暂停和恢复:利用Python的yield关键字的特性,生成器在yield处暂停,再次调用next()send()方法时恢复。
  3. 修改内部状态:通过send()方法向生成器传递值,从而修改生成器内部状态。

Python代码实现

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b


# 创建生成器实例
gen = fibonacci_generator()

# 获取并打印前几个斐波那契数
for _ in range(5):
    print(next(gen))

# 暂停和恢复
# 这里暂停是通过等待外部操作,如用户输入,来模拟
input("按任意键恢复...")

# 继续生成斐波那契数
for _ in range(3):
    print(next(gen))

# 修改内部状态
# 例如,重置斐波那契数列的起始值
def reset_generator(gen, new_a, new_b):
    gen.close()
    def new_fibonacci_generator():
        a, b = new_a, new_b
        while True:
            yield a
            a, b = b, a + b
    return new_fibonacci_generator()


new_gen = reset_generator(gen, 10, 20)
for _ in range(3):
    print(next(new_gen))