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

Python类方法中yield生成器无返回值问题求助

生成器耗尽导致类方法内无返回值的原因及解决办法

问题根源

你遇到的核心问题是生成器是一次性迭代对象:

  • self.data是extract()方法返回的生成器,生成器在被完整遍历一次后,就会进入"耗尽"状态,后续再遍历它不会产生任何新值。
  • 当你在类外部调用get_val()并迭代它时,实际上已经把self.data这个生成器的所有元素都遍历完了。此时再调用plot()方法,get_val()遍历的是已经耗尽的self.data,自然得不到任何值,所以y是空列表[]。

解决办法

根据你的使用场景,有以下几种可行方案:

1. 提前将生成器转换为列表存储

如果数据量不大,在__init__里直接把生成器转为列表,这样每次遍历的都是列表的副本,不会出现耗尽问题:

class Series:
    def __init__(self, x, raw_data, window):
        self.x = x
        self.raw_data = raw_data
        # 将生成器转换为列表,持久化存储数据
        self.data = list(self.extract(window))
    
    def extract(self, window):
       # 你的计算逻辑
       yield result

    def get_val(self):
        for point in self.data:
            yield point.val
        
    def plot(self):
        y = list(self.get_val())
        plt.plot(self.x, y)

2. 每次需要数据时重新生成生成器

如果数据量很大,不想提前占用内存,可以让get_val()每次都重新调用extract()生成新的生成器:

class Series:
    def __init__(self, x, raw_data, window):
        self.x = x
        self.raw_data = raw_data
        self.window = window  # 保存window参数
    
    def extract(self, window):
       # 你的计算逻辑
       yield result

    def get_val(self):
        # 每次调用都重新生成生成器
        for point in self.extract(self.window):
            yield point.val
        
    def plot(self):
        y = list(self.get_val())
        plt.plot(self.x, y)

3. 使用可重置的生成器类

如果需要更灵活的控制,可以自定义一个封装生成逻辑的类,每次需要迭代时创建新的实例:

class ExtractGenerator:
    def __init__(self, raw_data, window):
        self.raw_data = raw_data
        self.window = window
    
    def __iter__(self):
        # 每次迭代时重新执行生成逻辑
        # 你的计算逻辑
        yield result

class Series:
    def __init__(self, x, raw_data, window):
        self.x = x
        self.generator = ExtractGenerator(raw_data, window)
    
    def get_val(self):
        for point in self.generator:
            yield point.val
        
    def plot(self):
        y = list(self.get_val())
        plt.plot(self.x, y)

内容的提问来源于stack exchange,提问作者Michael Teguh Laksana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:10:47