2016-07-19 21 views
0

我正在嘗試將我創建的類創建爲無限序列生成器。如何打印發生器對象產生價值?

類是基本上是這樣的(I省略了其它的方法,因爲它是大):

class Step(object): 
    ''' A Step taken through a field. ''' 
    def __init__(self, step_id, offset, danger, 
     danger_limit=None, is_encounter = None, input=None): 
     self.step_id = step_id 
     self.offset = offset 
     self.danger = danger 
     self.is_encounter = is_encounter 
     self.rnd = self.get_rnd(self.step_id, self.offset) 
     self.danger_limit = self.get_danger_limit(self.rnd) 

    def __repr__(self): 
     return '{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}'.format(
      self.step_id, self.offset, self.danger, 
      self.rnd, self.danger_limit, self.is_encounter, self.input) 

    def __iter__(self): 
     return self 

    def advance_step(self, danger_inc=113): 
     ''' To help with generator functions. ''' 
     # Advances the current step, so make a current step object. 
     old_Step = Step(step_id=self.step_id, offset=self.offset, danger=self.danger) 

     step_id = Step.get_step_id(old_Step.step_id) 
     offset = Step.get_offset(step_id, old_Step.offset) 
     danger = Step.get_danger(danger_inc, old_Step.danger, old_Step.danger_limit) 
     new_step = Step(step_id = step_id, offset = offset, danger = danger) 
     new_step.is_encounter = Step.is_encounter(new_step.danger, 
      new_step.danger_limit) 
     return new_step 

    def next(self): 
     ''' Yields next step in sequence. ''' 
     while True: 
      yield self.advance_step() 

我想打印步驟對象序列。所以,我想這一點:

def main(): 
    step = Step(step_id=250, offset=13, danger=0) 
    print step.next() 
    # Generate next 4 steps in sequence. 
    for i in xrange(4): 
     print step.next() 

不過,我得到這樣的輸出:

<generator object next at 0x104364cd0> 
<generator object next at 0x104364cd0> 
<generator object next at 0x104364cd0> 
<generator object next at 0x104364cd0> 
<generator object next at 0x104364cd0> 

預期的輸出結果應類似於步驟對象序列:

0 250 13 2048 0 74 19200 False None 
1 252 13 2048 2048 216 55552 False None 
2 254 13 2048 4096 163 41984 False None 
3 0 26 2048 6144 151 38912 False None 
4 2 26 2048 8192 212 54528 False None 

我得到預期的輸出,如果我做到以下幾點:

step2 = step.advance_step() 
step3 = step2.advance_step() 
step4 = step3.advance_step() 
print step,'\n', step2,'\n', step3,'\n', step4 

如何打印已生成的步驟對象並不讓生成器對象返回?

我想我做的事情非常錯誤,但我看不到它是什麼。

回答

2

A next()方法必須返回一個值表示iterable表示的序列中的值。您爲每一步都返回了一臺發電機。

只返回一個值,也沒有必要使用這裏的循環:

def next(self): 
    ''' Yields next step in sequence. ''' 
    return self.advance_step() 

你可以只重命名advance_step()至當然next()

iterator.next() documentation

返回從容器中的一個項目。如果沒有其他項目,請提出StopIteration例外。