Duplicate possible:
Emule une boucle do-while en Python?
Y a t-il
do until x:
...
en Python, ou un moyen agréable d'implémenter une telle construction en boucle?
Il n'y a pas de boucle do-while en Python.
Ceci est une construction similaire, tirée du lien ci-dessus.
while True:
do_something()
if condition():
break
Il n'y a pas de "do-while" préemballé, mais le moyen général Python d'implémenter des constructions de boucle particulières consiste à utiliser des générateurs et d'autres itérateurs, par exemple:
import itertools
def dowhile(predicate):
it = itertools.repeat(None)
for _ in it:
yield
if not predicate(): break
alors, par exemple:
i=7; j=3
for _ in dowhile(lambda: i<j):
print i, j
i+=1; j-=1
exécute une jambe, comme souhaité, même si le prédicat est déjà faux au début.
Il est généralement préférable d’encapsuler plus de la logique de bouclage dans votre générateur (ou autre itérateur) - par exemple, si vous avez souvent des cas où une variable augmente, une diminue, et vous avez besoin d’une boucle do/while pour les comparer, vous pouvez coder :
def incandec(i, j, delta=1):
while True:
yield i, j
if j <= i: break
i+=delta; j-=delta
que vous pouvez utiliser comme:
for i, j in incandec(i=7, j=3):
print i, j
C'est à vous de décider de la quantité de logique liée aux boucles que vous souhaitez insérer dans votre générateur (ou autre itérateur) et de celle que vous souhaitez avoir en dehors de celle-ci (comme pour toute autre utilisation d'une fonction, d'une classe ou d'un autre mécanisme que vous pouvez utiliser). pour refactoriser le code de votre flux principal d’exécution), mais, en général, j’aime voir le générateur utilisé dans une boucle for
comportant peu (idéalement aucune) "logique de contrôle" (code relatif à la mise à jour). variables d'état pour la prochaine étape de la boucle et/ou faire des tests pour savoir si vous devez ou non boucler de nouveau).
Je préfère utiliser une variable en boucle, car elle a tendance à être un peu plus agréable que simplement "while 1:", et aucune déclaration laide break
:
finished = False
while not finished:
... do something...
finished = evaluate_end_condition()
Non il n'y en a pas. Utilisez plutôt une boucle while
telle que:
while 1:
...statements...
if cond:
break