Есть ли способ для одного метода получить следующее значение из генератора в другом методе? - PullRequest
2 голосов
/ 10 мая 2019

В моем методе get_new_point есть генератор, который извлекает кортеж данных из фрейма данных в рамках dict. В идеале, когда я запускаю метод update_trailing_points, он получает следующий кортеж из генератора. Однако, когда я на самом деле запускаю метод update_trailing_points, он каждый раз возвращает один и тот же кортеж (первая строка из фрейма данных). Что я тут не так делаю?

Позвольте мне объяснить мои структуры данных, потому что я знаю, что они могут быть немного запутанными:

all_data - это фрагмент данных. Ключи являются «символами»

symbol_list - список ключей (символов)

    def get_new_point(self,symbol):
        for i in self.all_data[symbol].index:
            yield tuple([self.all_data[symbol]['timestamp'][i],\ 
                         self.all_data[symbol]['point'][i])

    def update_trailing_points(self):
        for s in self.symbol_list:
            try:
                new_point = self.get_new_point(s).__next__()
            except StopIteration:
                self.continue_test = False

Ответы [ 3 ]

1 голос
/ 10 мая 2019

self.get_new_point(s) возвращает объект генератора.

new_point = self.get_new_point(s).__next__()

Вы переинициализируете генератор каждый раз, когда запускается этот фрагмент кода. Вы должны делать вызов self.get_new_point(s) только один раз, но __next__() для этого объекта несколько раз.

0 голосов
/ 10 мая 2019

FWIW, ваш get_new_point может быть «улучшен»:

def make_point_generator(self, symbol):
    df = self.all_data[symbol][['timestamp', 'point']]
    yield from df.itertuples(index=False)

Желательно использовать функциональность 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
0 голосов
/ 10 мая 2019

Это не то, как генераторы используются.Проверьте это:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...