Возможный дубликат:
Эмулировать цикл 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