Solución:
No hay un ciclo do-while en Python.
Esta es una construcción similar, tomada del enlace anterior.
while True:
do_something()
if condition():
break
Prefiero usar una variable de bucle, ya que tiende a leer un poco mejor que solo “while 1:”, y no tiene un aspecto feo. break
declaración:
finished = False
while not finished:
... do something...
finished = evaluate_end_condition()
No hay “do-while” preempaquetado, pero la forma general de Python para implementar construcciones de bucle peculiares es a través de generadores y otros iteradores, por ejemplo:
import itertools
def dowhile(predicate):
it = itertools.repeat(None)
for _ in it:
yield
if not predicate(): break
así por ejemplo:
i=7; j=3
for _ in dowhile(lambda: i<j):
print i, j
i+=1; j-=1
ejecuta un tramo, como se desee, aunque el predicado ya es falso al principio.
Normalmente es mejor encapsular más de la lógica de bucle en su generador (u otro iterador); por ejemplo, si a menudo tiene casos en los que una variable aumenta, una disminuye y necesita un bucle do / while para compararlas, podría codificar :
def incandec(i, j, delta=1):
while True:
yield i, j
if j <= i: break
i+=delta; j-=delta
que puedes usar como:
for i, j in incandec(i=7, j=3):
print i, j
Depende de usted cuánta lógica relacionada con el bucle desea poner dentro de su generador (u otro iterador) y cuánto desea tener fuera de él (al igual que para cualquier otro uso de una función, clase u otro mecanismo que pueda usar para refactorizar el código de su flujo principal de ejecución), pero, en general, me gusta ver el generador usado en un for
bucle que tiene poca (idealmente ninguna) “lógica de control de bucle” (código relacionado con la actualización de las variables de estado para el siguiente tramo del bucle y / o realizar pruebas sobre si debería volver a realizar el bucle o no).