2015-02-27 3 views
0

Я работаю над улучшением своего питона и повышением скорости на генераторах. У меня есть объект, над которым я работаю, для обработки ряда событий. Я хочу, чтобы список событий вытягивался последовательно и с помощью различных методов. Я хочу использовать генераторы для этой цели (я знаю, что я могу написать что-то еще, чтобы сделать это без них).Python Generator/Iterator

Вот пример кода, который я работал на:

def _get_next_event(): 
    def gen(): 
     for i,event in enumerate(range(1,10)): 
      yield event 

    iterator = gen() 
    def run(): 
     return iterator 

    run.next = iterator.__next__ 
    return run 

t = _get_next_event() 
t.next() 
for x in t(): 
    if x < 5: 
     print(x) 
    else: 
     break 

t.next() 

Это позволяет мне сделать цикл по событиям, а также тянуть следующий индивидуально с помощью следующего метода функции.

Я реализую это в моем классе, это выглядит следующим образом:

def _get_next_event(self): 
    def gen(): 
     print(self.all_sessions) 
     for event in self.all_sessions: 
      yield event['event'] 
    iterator = gen() 
    def run(): 
     return iterator 
    run.next = iterator.__next__ 
    return run 

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

self._get_next_event = self._get_next_event() 

Я думаю, что должен быть более элегантный способ сделать это ... что мне не хватает?

ответ

1

Обычно генераторы ... не написаны так.

Обычно, вы бы просто использовать yield в функции верхнего уровня:

def _get_next_event(): 
    for i,event in enumerate(range(1,10)): 
     yield event 

Вы можете просто написать следующее:

for event in _get_next_event(): 
    # do something with event 

Возможно, вы имели некоторые основания для этого ему путь вы показали, но эта причина не очевидна из кода, который вы опубликовали.

(для записи, я предполагаю, что ваш генератор не буквально выглядеть так, или иначе я бы вам сказать, чтобы изменить все тело функции return range(1, 10))

+0

Правильно, что код просто покажите вам, с чем я работаю. Цель состоит в том, чтобы вытащить предметы из генератора. В цикле я хочу вытащить из него дополнительные элементы, тогда эти элементы не должны включаться в следующую итерацию цикла. – browskie