Python 一种方法是否可以通过另一种方法从生成器获取下一个值?
我的get_new_point方法中有一个生成器,用于从dict中的数据帧检索数据元组。理想情况下,当我运行update_training_points方法时,它将从生成器检索下一个元组。但是,当我实际运行update_trailing_points方法时,它每次都返回相同的元组(数据帧的第一行)。我做错了什么 让我解释一下我的数据结构,因为我知道它们可能有点混乱: 所有的数据都是数据帧的dict。钥匙是“符号” 符号列表是键(符号)的列表Python 一种方法是否可以通过另一种方法从生成器获取下一个值?,python,pandas,generator,Python,Pandas,Generator,我的get_new_point方法中有一个生成器,用于从dict中的数据帧检索数据元组。理想情况下,当我运行update_training_points方法时,它将从生成器检索下一个元组。但是,当我实际运行update_trailing_points方法时,它每次都返回相同的元组(数据帧的第一行)。我做错了什么 让我解释一下我的数据结构,因为我知道它们可能有点混乱: 所有的数据都是数据帧的dict。钥匙是“符号” 符号列表是键(符号)的列表 self.get\u new\u点返回生成器对象 ne
self.get\u new\u点
返回生成器对象
new_point = self.get_new_point(s).__next__()
每次运行这段代码时,您都在初始化生成器。
您应该只在该对象上调用一次
self.get\u new\u point
,但多次调用\u next\u()
发电机不是这样使用的。选中此项:
def test(n):
for i in range(10):
yield i
# bad: creates a new generator every time.
n = 10
for i in range(n):
print(test(n).__next__())
# good: creates a single generator then iterates over it
n = 10
t = test(n)
for i in range(n):
print(next(t))
FWIW,您的
获取新点可以“改进”:
建议尽可能直接使用pandas
功能
我假设你想要一个点上的生成器。然后:
def __init__(self):
self.__gens = None
def update_trailing_points(self):
if self.__gens is None:
self.__gens = {s: self.make_point_generator(s) for s in self.symbol_list}
for s in self.symbol_list:
try:
new_point = next(self.__gens[s])
except StopIteration:
self.continue_test = False
谢谢这真的很有帮助
def make_point_generator(self, symbol):
df = self.all_data[symbol][['timestamp', 'point']]
yield from df.itertuples(index=False)
def __init__(self):
self.__gens = None
def update_trailing_points(self):
if self.__gens is None:
self.__gens = {s: self.make_point_generator(s) for s in self.symbol_list}
for s in self.symbol_list:
try:
new_point = next(self.__gens[s])
except StopIteration:
self.continue_test = False