Мне нужно эмулировать цикл do-while в программе Python. К сожалению, следующий простой код не работает:
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"
Вместо «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
']
Что я могу сделать, чтобы перехватить исключение «остановка итерации» и правильно разорвать цикл while?
Пример того, почему такая вещь может понадобиться, показан ниже как псевдокод.
Государственный аппарат:
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
источник
источник
s=i.next()
вместо None и, возможно, выполняете некоторую начальную работу, а не просто делаете свой первый проход через цикл бесполезным.Ответы:
Я не уверен, что вы пытаетесь сделать. Вы можете реализовать цикл do-while следующим образом:
Или:
Что вы делаете, пытаясь использовать цикл do while, чтобы напечатать материал в списке? Почему бы просто не использовать:
Обновить:
Так у вас есть список строк? И вы хотите продолжать повторять это? Как насчет:
Это похоже на то, что вы хотели бы? С вашим примером кода это будет:
источник
Вот очень простой способ эмулировать цикл do-while:
Ключевыми особенностями цикла do-while является то, что тело цикла всегда выполняется по крайней мере один раз, и что условие оценивается в нижней части тела цикла. Структура управления, показанная здесь, выполняет оба из них без необходимости в исключениях или операторах прерывания. Он вводит одну дополнительную логическую переменную.
источник
break
. В частности, если есть ПОСЛЕДУЮЩАЯ логикаtest_loop_condition()
, которая не должна выполняться после того, как мы закончим, она должна быть включенаif condition:
. Кстати,condition
расплывчато. Более описательный:more
илиnotDone
.break
в циклах, и когда я сталкиваюсь с этим в коде, который я поддерживаю, я обнаруживаю, что цикл, чаще всего, мог бы быть написан без него. Представленное решение, IMO, является наиболее ясным способом представления конструкции do while в python.has_no_errors
илиend_reached
(в этом случае цикл начнетсяwhile not end_reached
Мой код ниже может быть полезной реализацией, подчеркивая основное различие между делать пока против пока как я понимаю.
Так что в этом одном случае вы всегда проходите цикл хотя бы один раз.
источник
while condition or first_pass:
. Затемcondition
всегда выполняется оценка в первую очередь, а общаяfirst_pass
оценка выполняется только дважды (первая и последняя итерация). Не забудьте инициализироватьcondition
перед циклом все, что вы хотите.Исключение разорвет цикл, так что вы можете также обработать его вне цикла.
Я предполагаю, что проблема с вашим кодом в том, что поведение
break
внутриexcept
не определено. Обычноbreak
поднимается только на один уровень вверх, поэтому, например,break
изнутриtry
идет напрямуюfinally
(если он существует) внеtry
, но не вне цикла.Связанный PEP: http://www.python.org/dev/peps/pep-3136
Связанный вопрос: разрыв из вложенных циклов
источник
->
Вы можете сделать функцию:
Но 1) это некрасиво. 2) Условие должно быть функцией с одним параметром, которая должна быть заполнена материалом (это единственная причина не следует использовать классический цикл while).
источник
while True: stuff(); if not condition(): break
очень хорошая идея. Спасибо!Вот более безумное решение другого паттерна - использование сопрограмм. Код все еще очень похож, но с одним важным отличием; нет никаких условий выхода вообще! Сопрограмма (цепочка сопрограмм на самом деле) просто останавливается, когда вы прекращаете кормить ее данными.
Приведенный выше код собирает все токены в виде кортежей,
tokens
и я полагаю, что нет разницы между исходным кодом.append()
и.add()
в исходном коде.источник
Я сделал это следующим образом ...
Мне кажется, это упрощенное решение, я удивлен, что здесь его еще не видел. Это, очевидно, также может быть обращено к
и т.п.
источник
для цикла do - while, содержащего операторы try
альтернативно, когда нет необходимости в предложении «наконец»
источник
источник
stuff
функция или повторение кода.while condition:
потому, чтоis True
подразумевается.condition
зависит от некоторой внутренней переменнойstuff()
, потому что эта переменная не определена в тот момент.Быстрый взлом:
Используйте так:
источник
Почему бы тебе просто не сделать
?
источник
Посмотрите, поможет ли это:
Установите флаг в обработчике исключений и проверьте его перед работой с s.
источник
while not flagBreak:
и удаляяif (flagBreak) : break
.flag
Я не могу понять, что означают значения True или False. Вместо этого используйтеdone
илиendOfIteration
. Код превращается вwhile not done: ...
.Если вы находитесь в сценарии, где вы зацикливаетесь, когда ресурс недоступен или что-то похожее, что вызывает исключение, вы можете использовать что-то вроде
источник
Для меня типичный цикл while будет примерно таким:
Я мог бы также включить for..loop в цикл while, если того требует ситуация, для циклического прохождения другого набора условий.
источник