Seite 1 von 1

Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 15:55
von mutetella
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

Re: Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 16:19
von Dauerbaustelle
Du kannst auch einfach `return` statt dem `StopIteration` nutzen.

Re: Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 16:36
von mutetella
@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...

Re: Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 16:43
von DasIch

Code: Alles auswählen

def gen(start=None):
    if start is not None:
        # loop

Re: Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 16:52
von derdon
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.

Re: Generator stoppen...

Verfasst: Freitag 1. Juli 2011, 19:06
von mutetella
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