1073 Stimmen

Wie emuliert man eine do-while-Schleife?

Ich muss eine do-while-Schleife in einem Python-Programm emulieren. Leider funktioniert der folgende unkomplizierte 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,done" 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 "Stop Iteration" abzufangen und eine while Schleife richtig zu unterbrechen?

Ein Beispiel dafür, warum so etwas notwendig sein kann, ist unten als Pseudocode dargestellt.

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

8voto

Mark Punkte 2015

Für eine do - while-Schleife mit try-Anweisungen

loop = True
while loop:
    generic_stuff()
    try:
        questionable_stuff()
#       to break from successful completion
#       loop = False  
    except:
        optional_stuff()
#       to break from unsuccessful completion - 
#       the case referenced in the OP's question
        loop = False
   finally:
        more_generic_stuff()

alternativ, wenn keine Notwendigkeit für die 'finally'-Klausel besteht

while True:
    generic_stuff()
    try:
        questionable_stuff()
#       to break from successful completion
#       break  
    except:
        optional_stuff()
#       to break from unsuccessful completion - 
#       the case referenced in the OP's question
        break

6voto

Naftuli Kay Punkte 82152

Schnelles Hacken:

def dowhile(func = None, condition = None):
    if not func or not condition:
        return
    else:
        func()
        while condition():
            func()

So verwenden:

>>> x = 10
>>> def f():
...     global x
...     x = x - 1
>>> def c():
        global x
        return x > 0
>>> dowhile(f, c)
>>> print x
0

5voto

MuSheng Punkte 347
while condition is True: 
  stuff()
else:
  stuff()

4voto

Martin Punkte 5651

Warum machst du nicht einfach

for s in l :
    print s
print "done"

?

1voto

Ajit Punkte 619

Wenn Sie sich in einem Szenario befinden, in dem Sie eine Schleife durchlaufen, während eine Ressource unverfügbar ist oder etwas Ähnliches, das eine Ausnahme auslöst, könnten Sie etwas verwenden wie

import time

while True:
    try:
       f = open('some/path', 'r')
    except IOError:
       print('File could not be read. Retrying in 5 seconds')   
       time.sleep(5)
    else:
       break

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X