Ich muss eine Do-While-Schleife in einem Python-Programm emulieren. Leider funktioniert der folgende einfache Code nicht:
list_of_ints = [ 1, 2, 3 ]
iterator = list_of_ints.__iter__()
element = None
while True:
if element:
print element
try:
element = iterator.next()
except StopIteration:
break
print "done"
Anstelle von "1,2,3, erledigt" wird die folgende Ausgabe gedruckt:
[stdout:]1
[stdout:]2
[stdout:]3
None['Traceback (most recent call last):
', ' File "test_python.py", line 8, in <module>
s = i.next()
', 'StopIteration
']
Was kann ich tun, um die Ausnahme "Iteration stoppen" abzufangen und eine while-Schleife ordnungsgemäß zu unterbrechen?
Ein Beispiel dafür, warum so etwas benötigt wird, ist unten als Pseudocode gezeigt.
Zustandsmaschine:
s = ""
while True :
if state is STATE_CODE :
if "//" in s :
tokens.add( TOKEN_COMMENT, s.split( "//" )[1] )
state = STATE_COMMENT
else :
tokens.add( TOKEN_CODE, s )
if state is STATE_COMMENT :
if "//" in s :
tokens.append( TOKEN_COMMENT, s.split( "//" )[1] )
else
state = STATE_CODE
# Re-evaluate same line
continue
try :
s = i.next()
except StopIteration :
break
python
while-loop
do-while
grigoryvp
quelle
quelle
s=i.next()
eher als "Keine" festlegen und möglicherweise erste Arbeiten ausführen, anstatt nur Ihren ersten Durchgang durch die Schleife unbrauchbar zu machen.Antworten:
Ich bin mir nicht sicher, was Sie versuchen zu tun. Sie können eine do-while-Schleife wie folgt implementieren:
Oder:
Was machst du, wenn du versuchst, eine do while-Schleife zu verwenden, um das Zeug in der Liste zu drucken? Warum nicht einfach verwenden:
Aktualisieren:
Haben Sie eine Liste mit Zeilen? Und Sie möchten es weiter durchlaufen? Wie wäre es mit:
Scheint das etwas in der Nähe von dem zu sein, was Sie wollen würden? Mit Ihrem Codebeispiel wäre es:
quelle
Hier ist eine sehr einfache Möglichkeit, eine Do-While-Schleife zu emulieren:
Die Hauptmerkmale einer do-while-Schleife sind, dass der Schleifenkörper immer mindestens einmal ausgeführt wird und dass die Bedingung am unteren Rand des Schleifenkörpers ausgewertet wird. Die hier gezeigte Kontrollstruktur führt beide aus, ohne dass Ausnahmen oder break-Anweisungen erforderlich sind. Es wird eine zusätzliche boolesche Variable eingeführt.
quelle
break
. Insbesondere wenn nachher Logik benötigttest_loop_condition()
wird, die nicht ausgeführt werden sollte, wenn wir fertig sind, muss sie eingewickelt werdenif condition:
. Übrigenscondition
ist vage. Beschreibender:more
odernotDone
.break
in Schleifen, und wenn ich es in Code finde, den ich pflege, stelle ich fest, dass die Schleife meistens ohne sie geschrieben worden sein könnte. Die vorgestellte Lösung ist IMO der klarste Weg, ein do while-Konstrukt in Python darzustellen.has_no_errors
oderend_reached
(in diesem Fall würde die Schleife beginnenwhile not end_reached
Mein Code unten könnte eine nützliche Implementierung sein, die den Hauptunterschied zwischen hervorhebt do-while vs. während so wie ich es verstehe.
In diesem Fall durchlaufen Sie die Schleife also immer mindestens einmal.
quelle
while condition or first_pass:
. Danncondition
wird immer zuerst und insgesamtfirst_pass
nur zweimal ausgewertet (erste und letzte Iteration). Vergessen Sie nicht,condition
vor der Schleife zu initialisieren , was Sie wollen.Eine Ausnahme unterbricht die Schleife, sodass Sie sie auch außerhalb der Schleife behandeln können.
Ich denke, dass das Problem mit Ihrem Code darin besteht, dass das Verhalten von
break
innenexcept
nicht definiert ist. Im Allgemeinenbreak
geht es nur eine Ebene nach oben, also geht zBbreak
innentry
direkt zufinally
(wenn es existiert) einem aus dertry
, aber nicht aus der Schleife.Verwandte PEP: http://www.python.org/dev/peps/pep-3136
Verwandte Frage: Ausbrechen verschachtelter Schleifen
quelle
->
Sie können eine Funktion ausführen:
Aber 1) Es ist hässlich. 2) Bedingung sollte eine Funktion mit einem Parameter sein, die mit Dingen gefüllt sein soll (dies ist der einzige Grund , die klassische while-Schleife nicht zu verwenden.)
quelle
while True: stuff(); if not condition(): break
ist eine sehr gute Idee. Vielen Dank!Hier ist eine verrücktere Lösung eines anderen Musters - unter Verwendung von Coroutinen. Der Code ist immer noch sehr ähnlich, aber mit einem wichtigen Unterschied; Es gibt überhaupt keine Ausstiegsbedingungen! Die Coroutine (Kette von Coroutinen wirklich) stoppt nur, wenn Sie aufhören, sie mit Daten zu füttern.
Der obige Code sammelt alle Token als Tupel
tokens
und ich gehe davon aus, dass es keinen Unterschied zwischen.append()
und.add()
im Originalcode gibt.quelle
Ich habe das so gemacht ...
Dies scheint mir die vereinfachte Lösung zu sein. Ich bin überrascht, dass ich sie hier noch nicht gesehen habe. Dies kann natürlich auch umgekehrt werden
usw.
quelle
für eine do - while - Schleife mit try - Anweisungen
alternativ, wenn die 'finally'-Klausel nicht erforderlich ist
quelle
quelle
stuff
eine Funktion sein oder der Codekörper muss wiederholt werden.while condition:
weilis True
impliziert ist.condition
von einer inneren Variablen von abhängtstuff()
, da diese Variable zu diesem Zeitpunkt nicht definiert ist.Schneller Hack:
Verwenden Sie wie folgt:
quelle
Warum tust du es nicht einfach?
?
quelle
Sehen Sie, ob dies hilft:
Setzen Sie ein Flag im Exception-Handler und überprüfen Sie es, bevor Sie am s arbeiten.
quelle
while not flagBreak:
und Entfernen der vereinfacht werdenif (flagBreak) : break
.flag
Ich kann nicht ableiten, was ein wahrer Wert oder ein falscher Wert bedeutet. Verwenden Sie stattdessendone
oderendOfIteration
. Der Code wird zuwhile not done: ...
.Wenn Sie sich in einem Szenario befinden, in dem Sie eine Schleife ausführen, während eine Ressource nicht verfügbar ist, oder etwas Ähnliches, das eine Ausnahme auslöst, können Sie Folgendes verwenden
quelle
Für mich ist eine typische while-Schleife ungefähr so:
Ich könnte auch eine for..- Schleife in die while-Schleife aufnehmen, wenn die Situation dies erfordert, um eine andere Bedingung zu durchlaufen.
quelle