try: element = iterator.next() except StopIteration: break
print"done"
Вместо "1,2,3, готово" выводится следующий вывод:
[stdout:]1 [stdout:]2 [stdout:]3 None['Traceback (most recent call last): ', ' File "test_python.py", line 8, in <module> s = i.next() ', 'StopIteration ']
Что я могу сделать, чтобы перехватить исключение 'stop iteration' и прервать while цикл правильно?
Пример того, зачем может понадобиться такая вещь, показан ниже в виде псевдокода.
Конечный автомат:
s = "" whileTrue : 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
Переведено автоматически
Ответ 1
Я не уверен, что вы пытаетесь сделать. Вы можете реализовать цикл do-while следующим образом:
whileTrue: stuff() if fail_condition: break
Или:
stuff() whilenot fail_condition: stuff()
Что вы делаете, пытаясь использовать цикл do while для печати содержимого в списке? Почему бы просто не использовать:
for i in l: print i print"done"
Обновить:
Итак, у вас есть список строк? И вы хотите продолжать повторять его? Как насчет:
for s in l: whileTrue: stuff() # use a "break" instead of s = i.next()
Похоже ли это на что-то близкое к тому, что вы хотели бы? В вашем примере кода это было бы:
for s in some_list: whileTrue: 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
Ответ 2
Вот очень простой способ эмулировать цикл do-while:
condition = True while condition: # loop body here condition = test_loop_condition() # end of loop
Ключевые особенности цикла do -while заключаются в том, что тело цикла всегда выполняется хотя бы один раз и что условие вычисляется в нижней части тела цикла. Показанная здесь структура управления выполняет оба этих действия без необходимости в исключениях или операторах break . Она вводит одну дополнительную логическую переменную.
Ответ 3
Приведенный ниже мой код может быть полезной реализацией, подчеркивающей основное различие между do-while и while, насколько я понимаю.
Итак, в этом случае вы всегда выполняете цикл хотя бы один раз.
first_pass = True while first_pass or condition: first_pass = False do_stuff()
Ответ 4
do { stuff() } while (condition())
->
whileTrue: stuff() ifnot condition(): break
Вы можете выполнить функцию:
defdo_while(stuff, condition): while condition(stuff()): pass
Но 1) Это некрасиво. 2) Условием должна быть функция с одним параметром, которая должна заполняться stuff (это единственная причина не использовать классический цикл while.)