You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类实例方法与生成器的区别及可迭代调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:39:04