2016-05-12 16 views
0

私はまだのPythonの比較的新しいですし、次のようなステートメントを使用している:"while true"ループの代替構文?

flag = False 
while flag == False: 
    # Do something here that might set the flag to True, 
    flag = True 

しかしこれがそうのように書くことができます。

while not flag: 
    # Do something... 
    flag = True 
while flag is False: 
    # Do something... 
    flag = True 

の更なる(優先?)な方法で

最初の3つの方法がより明示的なので、4番目の方法よりもこれらの理由(またはその1つ)が好まれないのはなぜですか? "while flag == False"を書く最初の3つの方法の間に違いはありますか?

+1

whileループの条件で意図を明確にしたい場合は、 'didnt_break_yet = lambda:True'を作成し、' while didnt_break_yet():#Do something'のように使用します。そうすれば、ループが無限に長く実行されることはありません* – WorldSEnder

+0

あなたの個人的な好みが何であれ、複数のオプションがある場合は、コードの文脈でどのようなものを使っても構いません。 –

答えて

-1

これらはすべて技術的に異なります。

def fun(x=None): 
    return x 

、と定義されるすべてがあなたの中のループのために:

例1

は、あなたが以下のように、意味のある何かを返さない関数の呼び出しがあると次の:この場合

def while1(): 
    flag = False 
    while flag == False: 
     flag = fun(None) 

def while2(): 
    flag = False 
    while flag is False: 
     flag = fun(None) 

def while3(): 
    flag = False 
    while not flag: 
     flag = fun(None) 

を、唯一while1while2は終了します。 bool(None)Falseとなるので、while3は無限に続きますが、None != FalseNone is not Falseのため、while1while2の両方が終了します。

ここでは、もっと複雑な例を使用すると面白くなります。今

例2

def fun(x): 
    return x 

、当社の各ループのために、我々はflag = fun(0)flag = fun()を変更しようとしています。

この場合、while1while3は終了し、while2は無期限に続きます。これは、bool(0) == False,0 == Falseですが、0 is not Falseです。

例3 - 破壊可能変数

さて、これは暗黙の対明示的な状況に状況に依存する理由である、破壊可能変数を持つ多く複雑になります。 mutableは、変更可能な任意のオブジェクトであり、dicts、listを含みます。不変オブジェクトは、タプル、整数、浮動小数点数、strなど、変更できないものです。

a = [] 
b = [] 
この場合

bool(a) == False、およびa == bが、a is not b

は、私は次があるとします。一言で言えば、偽りや真偽値をチェックする方法については、単純で、堅実なルールはありません。

ただし、一般的な規則があります。 [なし]以外の値を受け入れた場合その他 対

通則

チェックなし、x is Noneをチェックしません。あなたが明示的に同じID(id(x) == id(b)でオブジェクトにチェックしたい場合はしない限り、破壊可能変数は、異なるIDを持つことができるので、x is bを使用しないでください破壊可能変数 をチェック

。 通常、not xまたはx == b

>>> a = [] 
>>> b = [] 
>>> a is b 
False 
>>> a == b 
True 
>>> not a 
True 
をチェック

strs、floatおよびintを確認する strs、floatおよびintの場合、常にx == bをチェックし、x is bをチェックしないでください。これは短いstrs、float、 ints、x == bの場合は結果は真ですが、より複雑な場合はコードが機能しなくなります。例えば

>>> a = 1 
>>> a is 1 
True 
>>> a = 10000000 
>>> a is 10000000 
False 

チェックブールブールのために

は、あなたが上記のいずれかを行うことができますが、not xx == bまたはx is bに好適です。

最後に... whileループ

あなたは、常にforループにwhileループを変換することができます。これは常に可能ではありませんが、単純なケースをしたいと言う:

x = 0 
while x < 10: 
    print(x) 
    x -= 1 

これは、に変換することができます。

for x in range(10): 
    print(x) 

ループのために使用するのではなく理由をループは、いくつかの場合である一方、あなたのコードでエラーが発生しますが、ループは無限ループに陥り、プログラムをクラッシュさせますが、forループは常に終了します。

+0

匿名のdownvoter、任意のコメント? –

+0

これは非常に有用な答えです、ありがとう!私は現在のアプリケーションのどれでも、 'flag'は' True'や 'False'としてのみ設定されていますが、基本的に' while True'はこれらの問題の発生を避けるために使うことができます。 – Lotte

+0

@Lotte、はい。 'while True'は条件が設定されるまで素晴らしいステートメントです。可能であれば、whileループをforループに変換しますが、そうするためにコードを畳み込む必要がある場合はwhileループが存在します。 –

0

私は本当に好みがあるとは思わない。 Whileループは、指定されたブール式がTrueのままであれば、コードブロックを実行し続けます。

フラグ==真、フラグではない、< 6またはブール式に評価する。あなたの例のように真の間だけ言うならば、無限ループに入るでしょう。それはあなたの質問に答えますか?

0

最初の3文字は明示的ですが、最後の文字はよりわかりやすく明瞭です。これは、私が言うように、これは他の3つよりも大きな選択肢になっています。ループの一部の変数の初期化を検索することはありません。それで、すべての方法は完全に受け入れられ、あなたはあなたにとってより快適なものを使うべきです。

0

私は単純なロジックのためにwhile True:の構文がうまくいくと思います。複数の場所からループを壊しはじめたり、ループが成功したかどうかを追跡する必要があると、それは乱雑になります。

また、while条件が正しく指定されていれば、なぜループしているのかをドキュメントの種類と並べ替えます。ループ内break文を回避

while not end_of_file: 
    ..read read read.. 

は、私見、コードをより読みやすくなります。関数内の複数のreturnステートメントを避けるのと同じです。

+0

私は複数の 'return'ステートメントを避ける理由が何であるか質問したいと思います。明快さのためだけですか?私はこれに罪があるかもしれません。 – Lotte

+0

@Lotteを参照してください。これは、コードをデバッグするより実際的な理由からです。すべてのコードが終了する場所を一度入れておけば、戻り値を把握することができます。 – swdev