web-dev-qa-db-fra.com

Y a-t-il un "do ... Until" en Python?

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?

127
Matt Joiner

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
230
theycallmemorty

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).

24
Alex Martelli

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()
22
PaulMcG

Non il n'y en a pas. Utilisez plutôt une boucle while telle que:

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