質問

Python で無限ループを作成する 2 つの方法を見てきました。

  1. while 1:
        do_something()
    
  2. while True:
        do_something()
    

これらの間に違いはありますか?一方は他方よりパイソン的ですか?

役に立ちましたか?

解決

基本的にそれは問題ではなく、そのような細部は何かが「Python的」であるかどうかには実際には影響しません。

ただし、トリビアに興味がある場合は、いくつかの違いがあります。

  1. 組み込みのブール型は Python 2.3 まで存在しませんでした そのため、古いバージョンで実行することを目的としたコードは、 while 1: 形状。たとえば、標準ライブラリで見ることができます。

  2. True および False 組み込み関数は次のとおりです。 Python 3 より前の予約語ではない に割り当てて、その値を変更することができます。コードでは次のことができるため、これは上記の場合に役立ちます True = 1 下位互換性のためですが、名前が True 使用するたびにグローバル辞書で検索する必要があります。

  3. 上記の制限のため、Python 2 では定数整数の最適化が行われているため、2 つのバージョンがコンパイルされるバイトコードは異なります。 True. 。Python はコンパイル時にそれを認識できるため、 1 常にゼロ以外である場合、条件付きジャンプが削除され、定数はまったくロードされません。

    >>> import dis
    >>> def while_1():
    ...     while 1:
    ...         pass
    ...
    >>> def while_true():
    ...     while True:
    ...         pass
    ...
    >>> dis.dis(while_1)
      2           0 SETUP_LOOP               5 (to 8)
    
      3     >>    3 JUMP_ABSOLUTE            3
                  6 POP_TOP
                  7 POP_BLOCK
            >>    8 LOAD_CONST               0 (None)
                 11 RETURN_VALUE
    >>> dis.dis(while_true)
      2           0 SETUP_LOOP              12 (to 15)
            >>    3 LOAD_GLOBAL              0 (True)
                  6 JUMP_IF_FALSE            4 (to 13)
                  9 POP_TOP
    
      3          10 JUMP_ABSOLUTE            3
            >>   13 POP_TOP
                 14 POP_BLOCK
            >>   15 LOAD_CONST               0 (None)
                 18 RETURN_VALUE
    

それで、 while True: 少し読みやすくなりましたし、 while 1: Python の古いバージョンに対しては少し親切です。最近では Python 2.2 で実行する必要がなくなり、ループのバイトコード数を気にする必要もなくなるため、前者の方がわずかに望ましいと言えます。

他のヒント

最も神託の方法は、常に、最も読みやすいでしょう。

while True:を使用します

それは本当に問題ではありません。どちらも個人的に私はいつも、もう少し明示的であるwhile Trueを、使用したいけれども、読んだり理解することは困難ではありません。

より一般的には、ブレークながら、人々はPythonで書くループの全体の多くは、何か他のものである可能性があります。時々私は、人々は、これは学習が必要ですが、愚かな過ちのために以下の定型と機会を持っているi = 0; while True: i += 1 ...を書き込むことができたときにfor i in itertools.count()while True: foo = fun() if foo is None: breakを書く人と交換することができるfor foo in iter(fun, None)を、書き込み見ています。

どちらでもない。

どちらも、コードをスキャンして、 break, 、停止条件を適切な場所で確認できないのです。

私は可能な限りこの種のことを避けるようにしていますが、それが不可能な場合は、次のようにコード自体に語らせます。

while not found_answer:
    check_number += 1
    if check_number == 42:
        found_answer = True

編集: 上記の「避ける」という言葉が十分に明確ではなかったようです。基本的に無限ループを使用し、ループ内のどこかからそれを残します( break) 通常は完全に避けるべきです. 。それが不可能な場合もあります。その場合、私は上記のコードのようなものを使用するのが好きです。 ただし、これは依然として同じ概念を表しています上記のコードは妥協にすぎません – しかし少なくとも、ループの目的を示すことはできます 初めに – 関数を呼び出さないのと同じように do_something_with_args(*args).

私は、これは主にスタイルの問題だと思います。両方が無限ループとして容易に理解すべきです。

しかし、個人的に私は2番目のオプションを好みます。それだけで、特にCの背景のないプログラマのため、理解するために精神的なマイクロステップかからからだ。

最初のものはTrueがまだ定義されていないこれらの初期のバージョンでも動作します。

あなたは有限時間で終了すると仮定されたアルゴリズムを使用している場合は、

、私はいつもwhile Trueよりも安全である、これをお勧めします:

maxiter = 1000
for i in xrange(maxiter):
   # your code
   # on success:
     break
else:
   # that algorithm has not finished in maxiter steps! do something accordingly

IMO 2番目のオプションは、より多くのです。の明白

あなたはwhileを取り除くと、より神託であるかもしれないよりコンパクトなコードを書く得ることができれば。
たとえばます:

# Get the even numbers in the range 1..10
# Version 1
l = []
n = 1
while 1:
    if n % 2 == 0: l.append(n)
    n += 1
    if n > 10: break
print l

# Version 2
print [i for i in range(1, 11) if i % 2 == 0]

# Version 3
print range(2, 11, 2)

私は2番目の式がより明示的であると考えているので、より多くのニシキヘビする

このスタイルの問題だけで、任意のプログラミングの初心者は、いずれかのオプションを理解します。

しかしTrueはPython 3まで可能だった、Falseするように割り当てられていなかった場合は、2番目のオプションは動作します:

>>> True = False
>>> True
False

より良い方法は、ループの外条件付きブレークで「真ながら」です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top