Возможный дубликат:
Эмулировать цикл do-while в Python?
Есть ли
do until x:
    ...
в Python или хороший способ реализовать такую петлевую конструкцию?
Возможный дубликат:
Эмулировать цикл do-while в Python?
Есть ли
do until x:
    ...
в Python или хороший способ реализовать такую петлевую конструкцию?
Это аналогичная конструкция, взятая из ссылки выше.
 while True:
     do_something()
     if condition():
        break
Нет готового "do-while", но общий способ Python для реализации особых конструкций циклов - это генераторы и другие итераторы, например:
import itertools
def dowhile(predicate):
  it = itertools.repeat(None)
  for _ in it:
    yield
    if not predicate(): break
так, например:
i=7; j=3
for _ in dowhile(lambda: i<j):
  print i, j
  i+=1; j-=1
выполняет, по желанию, одну ногу, даже если предикат уже неверен в начале.
Обычно лучше инкапсулировать больше логики цикла в ваш генератор (или другой итератор) - например, если у вас часто бывают случаи, когда одна переменная увеличивается, она уменьшается, и вам нужен цикл do/while, сравнивающий их, вы можете ввести код:
def incandec(i, j, delta=1):
  while True:
    yield i, j
    if j <= i: break
    i+=delta; j-=delta
который вы можете использовать как:
for i, j in incandec(i=7, j=3):
  print i, j
Это зависит от вас, сколько логики, связанной с циклом, вы хотите поместить внутри своего генератора (или другого итератора) и сколько вы хотите иметь вне него (как и для любого другого использования функции, класса или другого механизм, который вы можете использовать для рефакторинга кода из основного потока выполнения), но, вообще говоря, мне нравится видеть генератор, используемый в цикле for, который имеет мало (в идеале нет) "логику управления циклом" (код, связанный с обновление переменных состояния для следующего этапа цикла и/или проведение тестов о том, нужно ли снова повторять цикл или нет).
Я предпочитаю использовать переменную цикла, так как она имеет тенденцию читать немного лучше, чем просто "while 1:", и не уродливое выражение break:
finished = False
while not finished:
    ... do something...
    finished = evaluate_end_condition()
Нет, нет. Вместо этого используйте цикл while, например:
while 1:
 ...statements...
  if cond:
    break