it-swarm.com.de

Gibt es ein "do ... until" in Python?

Mögliches Duplikat:
Eine Do-While-Schleife in Python emulieren?

Gibt es eine

do until x:
    ...

in Python oder eine nette Möglichkeit, ein solches Schleifenkonstrukt zu implementieren?

127
Matt Joiner

In Python gibt es keine do-while-Schleife.

Dies ist ein ähnliches Konstrukt aus dem obigen Link.

 while True:
     do_something()
     if condition():
        break
230
theycallmemorty

Es gibt kein vorgefertigtes "do-while", aber die allgemeine Python Methode zum Implementieren spezieller Schleifenkonstrukte besteht in Generatoren und anderen Iteratoren, z.

import itertools

def dowhile(predicate):
  it = itertools.repeat(None)
  for _ in it:
    yield
    if not predicate(): break

also zum beispiel:

i=7; j=3
for _ in dowhile(lambda: i<j):
  print i, j
  i+=1; j-=1

führt wie gewünscht ein Bein aus, obwohl das Prädikat zu Beginn bereits falsch ist.

Normalerweise ist es besser, mehr von der Schleifenlogik in Ihrem Generator (oder einem anderen Iterator) zu kapseln. Wenn Sie beispielsweise häufig Fälle haben, in denen eine Variable zunimmt, eine abnimmt und Sie eine do/while-Schleife benötigen, die sie vergleicht, können Sie Code erstellen :

def incandec(i, j, delta=1):
  while True:
    yield i, j
    if j <= i: break
    i+=delta; j-=delta

was du wie folgt benutzen kannst:

for i, j in incandec(i=7, j=3):
  print i, j

Es liegt an Ihnen, wie viel schleifenbezogene Logik Sie in Ihren Generator (oder einen anderen Iterator) einfügen möchten und wie viel außerhalb des Generators (genau wie bei jeder anderen Verwendung einer Funktion, Klasse oder eines anderen Mechanismus, den Sie verwenden können) verwenden, um Code aus Ihrem Hauptausführungsstrom umzugestalten), aber im Allgemeinen mag ich es, wenn der Generator in einer for - Schleife verwendet wird, die wenig (im Idealfall keine) "Schleifensteuerlogik" (Code im Zusammenhang mit Aktualisieren von Statusvariablen für den nächsten Loop-Abschnitt und/oder Durchführen von Tests, ob Sie erneut einen Loop durchführen sollen oder nicht).

24
Alex Martelli

Ich bevorzuge die Verwendung einer Schleifenvariablen, da diese tendenziell ein bisschen besser liest als nur "while 1:" und keine hässlich aussehende break -Anweisung:

finished = False
while not finished:
    ... do something...
    finished = evaluate_end_condition()
22
PaulMcG

Nein, gibt es nicht. Verwenden Sie stattdessen eine while -Schleife wie:

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