2009-11-02 5 views
95

可能性の重複:
Emulate a do-while loop in Python?Pythonで "do ... until"はありますか?

Pythonで

do until x: 
    ... 

あり、または構築などループを実装するための良い方法はありますか?

+8

言語リファレンスマニュアルを参照すると、どのようなコンパウンドステートメントが表示されましたか? http://docs.python.org/reference/compound_stmts.html –

+0

重複:http://stackoverflow.com/questions/743164/do-while-loop-in-python – ChristopheD

+3

do-while(ただし、 'until')はPythonにとって私の最大の希望です。 –

答えて

181

There is no do-while loop in Python.

これは、上記のリンクから採取された類似の構築物は、です。

while True: 
    do_something() 
    if condition(): 
     break 
+25

ところで、これは "ループアンドハーフ"と呼ばれています。Pythonはこの構文をサポートし続けています。なぜなら、それは正しく書いて理解するための最も簡単なループパターンの1つなのです。 http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half – Brandon

+1

@Brandonこれは、「while!condition do_something()」とは違うのですか? – Bort

+6

@Bort loop-and-a-half構造は、ループの始めに 'condition()'が真であっても、少なくとも 'do_something()'が少なくとも一度は実行されることを保証します。 'condition():do_something()'コンストラクトは、 'condition()'が最初にtrueに評価された場合、 'do_something()'を実行しません。 – Brandon

22

なしパッケージ化されたが、「-しばらくやる」が、独特のループ構文を実装するための一般的な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 

は、開始時に述語が既に偽であっても、必要に応じて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 

それはあなたがあなたの発電機(または他のイテレータ)の内側に配置したいどのくらいのループ関連のロジックはあなた次第ですが、どのくらいあなたはそれの外にいたいと思うあなたがメインの実行ストリームからコードをリファクタリングするのに使うことができる関数、クラス、または他のメカニズムのことです)。しかし、一般的に言えば、私はループがほとんどない(理想的にはnone) "ループを持っているforループ(次のループ脚の状態変数を更新することに関連するコード、および/またはあなたが再度ループする必要があるかどうかについてのテストを行う)。

+2

[itertools.takewhile](https://docs.python.org/2/library/itertools.html#itertools.takewhile)を使用できます。 –

6

いいえありません。代わりに使用whileループのような:「しばらく1:」私はそれがちょうどより少しよりよい読みする傾向があるとして、ループ変数を使用することを好むん

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

なぜ 'while 1'ですか?真の間に何が問題なの?なぜintからboolへの変換を強制するのですか? –

+6

@SLott実際には、Python 2.Xでは、True/Falseはキーワードではなく、グローバル定数(他の変数と同じように再割り当て可能)で構築されているため、インタプリタはポイントを確認する必要があります。 http://stackoverflow.com/a/3815387/311220 – Acorn

+5

「通訳者は何を指しているか確認する必要があります」を参照してください。何?これが何らかの有用な最適化であると主張していますか?もしそうなら、あなたはその請求を実証するための 'timeit'ベンチマークを持っていますか? –

17

、そして何の醜いに見えるbreak声明:

finished = False 
while not finished: 
    ... do something... 
    finished = evaluate_end_condition() 
関連する問題