188 votes

Existe-t-il un "do ... Until" en Python?

Dupliquer possible:
boucle do-while en python?

y a t-il

 do until x:
    ...
 

en Python, ou un bon moyen d'implémenter une telle construction en boucle?

319voto

theycallmemorty Points 4609

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
 

47voto

Paul McGuire Points 24790

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

29voto

Alex Martelli Points 330805

Il n'y a pas préemballés ", tandis que", mais le Python façon de mettre en œuvre particulières les constructions de bouclage est par le biais de 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

ainsi, 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à fausse au début.

Il est normalement préférable d'encapsuler plus de la boucle de la logique dans votre générateur (ou d'autres itérateur) -- par exemple, si vous avez souvent des cas où une variable augmente, on diminue, et vous avez besoin d'une boucle do-while en les comparant, vous pourriez code:

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 combien de boucle liées à la logique que vous souhaitez mettre à l'intérieur de votre générateur (ou d'autres itérateur) et combien vous voulez avoir en dehors d'elle (comme pour toute autre utilisation d'une fonction, une classe, ou d'un autre mécanisme que vous pouvez utiliser pour refactoriser le code de votre flux principal d'exécution), mais, de façon générale, j'aime voir le générateur utilisé dans un for boucle qui a peu (idéalement aucun) la "boucle de la logique de contrôle" (code en matière de mise à jour des variables d'état pour la prochaine boucle de la jambe et/ou de faire des tests pour savoir si vous devriez être le bouclage de nouveau ou pas).

12voto

f0b0s Points 1130

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X