web-dev-qa-db-ja.com

Pythonに「do ... until」はありますか?

可能性のある複製:
Pythonでdo-whileループをエミュレートしますか?

ありますか

do until x:
    ...

python、またはそのようなループ構造を実装する素敵な方法ですか?

123
Matt Joiner

Pythonにはdo-whileループはありません。

これは上記のリンクから取られた同様の構成です。

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

あらかじめパッケージ化された「do-while」はありませんが、固有のループ構造を実装する一般的なPython方法は、ジェネレーターやその他のイテレーターを使用することです。

import itertools

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

そのため、例えば:

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

開始時に述語がすでにfalseであっても、必要に応じて1つのレッグを実行します。

通常、より多くのループロジックをジェネレータ(または他のイテレータ)にカプセル化する方が適切です-たとえば、1つの変数が増加し、1つの変数が減少するケースが頻繁にあり、それらを比較するdo/whileループが必要な場合は、コーディングできます:

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

次のように使用できます:

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

ジェネレーター(または他のイテレーター)内に配置するループ関連ロジックの量と、その外側に配置する量(関数、クラス、または他のメカニズムの他の使用と同様)実行のメインストリームからコードをリファクタリングするために使用します)、しかし、一般的に言えば、「ループ制御ロジック」(ほとんどない)を持つforループで使用されるジェネレーターを見るのが好きです次のループ区間、および/または再度ループする必要があるかどうかのテストを行います)。

24
Alex Martelli

ループ変数は、「while 1:」よりも少し読みやすく、見苦しいbreakステートメントがないため、ループ変数を使用することを好みます。

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

ありません。代わりに、次のようなwhileループを使用します。

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