Есть ли "до..." в Python?

Возможный дубликат:
Эмулировать цикл do-while в Python?

Есть ли

do until x:
    ...

в Python или хороший способ реализовать такую ​​петлевую конструкцию?

Ответ 1

В Python нет цикла do-while.

Это аналогичная конструкция, взятая из ссылки выше.

 while True:
     do_something()
     if condition():
        break

Ответ 2

Нет готового "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, который имеет мало (в идеале нет) "логику управления циклом" (код, связанный с обновление переменных состояния для следующего этапа цикла и/или проведение тестов о том, нужно ли снова повторять цикл или нет).

Ответ 3

Я предпочитаю использовать переменную цикла, так как она имеет тенденцию читать немного лучше, чем просто "while 1:", и не уродливое выражение break:

finished = False
while not finished:
    ... do something...
    finished = evaluate_end_condition()

Ответ 4

Нет, нет. Вместо этого используйте цикл while, например:

while 1:
 ...statements...
  if cond:
    break