类实例方法与生成器的区别及可迭代调用Bingo生成器实现问题
问题解答
改造方案
完全可以在你现有类的基础上改造,不需要完全重写,只需要补充迭代器协议实现、优化抽取逻辑、增加要求的全局调用函数即可。
改造后完整代码
import random class Bingo: def __init__(self, size): self.initial_size = size self.picked_balls = [] # 初始化打乱所有候选球,避免每次抽取时遍历判断已选球,性能更高 self.balls_pool = random.sample(range(1, size + 1), size) # 实现迭代器协议,支持for循环遍历 def __iter__(self): return self # 实现__next__方法,支持next()直接调用实例 def __next__(self): if not self.balls_pool: raise StopIteration("所有球已抽取完成") current_ball = self.balls_pool.pop() self.picked_balls.append(current_ball) # 返回已选球的副本,避免外部修改影响实例内部状态 return (current_ball, self.picked_balls.copy(), len(self.balls_pool)) # 实现要求的全局pick_ball调用方法 def pick_ball(bingo_instance): return next(bingo_instance)
调用测试
# 符合要求的初始化方式 bg = Bingo(75) # 支持next()调用 print(next(bg)) # 输出示例:(60, [60], 74) # 支持pick_ball(bg)调用 print(pick_ball(bg)) # 输出示例:(33, [60, 33], 73)
类实例方法和生成器的区别
- 类实例方法是绑定在类实例上的普通函数,每次调用都会从头开始执行,执行完成后释放上下文,返回最终结果,本身不会保存执行的中间状态。
- 生成器是特殊的迭代器,内部通过
yield关键字返回值,每次调用next()触发执行到yield位置就会暂停,保存当前所有上下文状态,下次调用next()时会从暂停位置继续执行,不需要每次从头运行逻辑。
本次需求的实现用了Python的迭代器协议,本质和生成器的能力一致,都是支持逐次调用、保存状态的可迭代对象。
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

