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
相关产品推荐
相关产品推荐

