I need to emulate a do-while loop in a Python program. Unfortunately, the following straightforward code does not work:
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"
Instead of "1,2,3,done", it prints the following output:
[stdout:]1 [stdout:]2 [stdout:]3 None['Traceback (most recent call last): ', ' File "test_python.py", line 8, in <module> s = i.next() ', 'StopIteration ']
What can I do in order to catch the 'stop iteration' exception and break a while loop properly?
An example of why such a thing may be needed is shown below as pseudocode.
State machine:
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
How to emulate a do while loop in Python. To create a do while loop in Python, you need to modify the while loop a bit in order to get similar behavior to a do while loop in other languages. As a refresher so far, a do while loop will run at least once. If the condition is met, then it will run again.
You can simulate the FOR LOOP in SQL Server (Transact-SQL) using the WHILE LOOP.
Python doesn't have do-while loop. But we can create a program like this. The do while loop is used to check condition after executing the statement. It is like while loop but it is executed at least once.
I am not sure what you are trying to do. You can implement a do-while loop like this:
while True: stuff() if fail_condition: break
Or:
stuff() while not fail_condition: stuff()
What are you doing trying to use a do while loop to print the stuff in the list? Why not just use:
for i in l: print i print "done"
Update:
So do you have a list of lines? And you want to keep iterating through it? How about:
for s in l: while True: stuff() # use a "break" instead of s = i.next()
Does that seem like something close to what you would want? With your code example, it would be:
for s in some_list: 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] ) break # get next s else: state = STATE_CODE # re-evaluate same line # continues automatically
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With