2017-04-07 3 views
0

Kann jemand erklären, wie die __next__ mit dem Code unten funktioniert? Ich weiß, dass "nächste" für Iteratoren verwendet wird, um das nächste Element eines iterierbaren Objekts zu übernehmen, normalerweise mit next().Iterables/generators Erklärung

Ich weiß, dass der __iter__ Teil ausgeführt wird wegen list() Aufruf, der __next__ ausführt. Aber __next__ weiter ausführt, fast wie eine Weile Schleife? Bis die StopIteration ausgeführt wird?

Auch, wo werden alle 'Return'-Elemente unter __next__ gespeichert? Wird alles nur im Speicher gespeichert, bis return self unter __iter__ es an die aufrufende Funktion zurückgibt?

class FRange(object): 
    def __init__(self, start, stop=None, step=None): 
     if stop is None: 
      self.i = 0 
      self.stop = start 
      self.step = 1 
     elif step is None: 
      self.i = start 
      self.stop = stop 
      self.step = 1 
     else: 
      self.i = start 
      self.stop = stop 
      self.step = step 

    def __iter__(self): 
     return self 

    def __next__(self):        
     if self.i < self.stop and self.step > 0: 
      self.i += self.step 
      return self.i - self.step 
     elif self.i > self.stop and self.step < 0: 
      self.i += self.step 
      return self.i - self.step 
     else: 
      raise StopIteration 


def rangeFloat(args): 
    return list(FRange(*args)) 

Der Code erzeugt oben für Beispiel:

For args = [-1.1, 2.4, 0.3], the output is 
rangeFloat(args) = [-1.1, -0.8, -0.5, -0.2, 0.1, 0.4, 0.7, 1, 1.3, 1.6, 1.9, 2.2]. 

Antwort

2

list arbeitet im Grunde wie

def list(thing): 
    result = [] 
    for item in thing: 
     result.append(item) 
    return result 

und eine for loop:

for item in thing: 
    # loop body 

Arbeiten wie

iterator = iter(thing): 
while True: 
    try: 
     item = next(iterator) 
    except StopIteration: 
     break 
    # loop body 

diese Dinge zusammen Einlochen, list ruft Ihre FRange__iter__ Methode der Instanz einen Iterator zu erhalten; In diesem Fall ist der Iterator Ihre eigene FRange Instanz. Es ruft dann __next__ wiederholt auf und hängt alle __next__ Rückgabewerte an die Liste an, bis __next__StopIteration ausgelöst wird. Sobald StopIteration ausgelöst wird, gibt list die Liste zurück, die es erstellt hat.

+1

sollte nächste (iter) nächste (Iterator) sein? – user1179317

+0

@ user1179317: In der Tat sollte es. – user2357112