2016-07-19 14 views
0

Ich versuche, eine Klasse, die ich erstellt habe, zu einem unendlichen Seriengenerator zu machen.Wie Drucken Generator Objekt ergab Wert?

Die Klasse im Grunde wie das ist (I weggelassen die anderen Methoden, wie es groß ist):

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() 

ich eine Folge von Schritt Objekte drucken möchten. Also habe ich versucht, dieses:

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() 

Allerdings bekomme ich diese Ausgabe:

<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> 

Erwartete Ausgabe wie eine Folge von Schritt Objekte aussehen sollte:

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 

ich die erwartete Ausgabe, wenn Ich mache folgendes:

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

Wie kann ich die ausgegebenen Schrittobjekte drucken und das Generatorobjekt nicht zurückholen?

Ich nehme an, ich mache etwas sehr falsch, aber ich kann nicht sehen, was es ist.

Antwort

2

Eine next() Methode muss einen Wert in der Reihenfolge, die das iterable darstellt, zurückgeben. Sie haben für jeden Schritt einen Generator zurückgegeben.

einfach den nächsten Wert zurück, gibt es keine Notwendigkeit, hier eine Schleife zu verwenden:

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

Sie könnten nur advance_step() zu next() natürlich umbenennen.

Vom iterator.next() documentation:

Return das nächste Element aus dem Container. Wenn keine weiteren Elemente vorhanden sind, erhöhen Sie die Ausnahme StopIteration.

Verwandte Themen