Generator stoppen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich bin mir nicht sicher, ob es für folgendes nicht eine bessere Lösung gibt:

Code: Alles auswählen

def gen(start=None):
    if start is None:
        raise StopIteration('No start no trip!')
    for trip in ['Paris', 'London', 'Bruessel', 'Heimertingen'][start:]:
        yield trip
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Du kannst auch einfach `return` statt dem `StopIteration` nutzen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Dauerbaustelle:
'return' in einem Generator geht nicht. Eben für das Funktions-'return' suche ich eine Alternative im Generator um diesen zu verlassen, wenn z. B. die Bedingungen für eine Schleife nicht gegeben sind...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

def gen(start=None):
    if start is not None:
        # loop
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

mutetella hat geschrieben:@Dauerbaustelle:
'return' in einem Generator geht nicht.
Es kommt darauf an, ob return ein Argument bekommt oder nicht:

Code: Alles auswählen

>>> def gen(start=None):
...     if start is None:
...         return
...     for trip in ['Paris', 'London', 'Bruessel', 'Heimertingen'][start:]:
...         yield trip
...         
... 
>>> x = gen()
>>> x.next()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration
>>> def gen2():
...     if 2 < 5:
...         return 38
...     else:
...         yield 42
SyntaxError: 'return' with argument inside generator (<input>, line 6)
Ich finde die Lösung von DasIch am einfachsten lesbar. Ist natürlich die Frage, ob du eine Fehlermeldung oder einfach nur StopIteration bei start=None haben willst.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

derdon hat geschrieben:Es kommt darauf an, ob return ein Argument bekommt oder nicht
Ok, das wusste ich nicht (weil ich die Fehlermeldung nicht ordentlich gelesen hab'...).
derdon hat geschrieben:Ich finde die Lösung von DasIch am einfachsten lesbar. Ist natürlich die Frage, ob du eine Fehlermeldung oder einfach nur StopIteration bei start=None haben willst.
Werde ich dann auch so machen. Ich wollte halt nicht den gesamten Anweisungsblock unter eine if-Bedingung stellen sondern schon vorher aussteigen. Aber letztlich ist das wohl die einfachste Möglichkeit...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten