「while 1」と「while True」の違いは何ですか?
-
20-09-2019 - |
質問
Python で無限ループを作成する 2 つの方法を見てきました。
while 1: do_something()
while True: do_something()
これらの間に違いはありますか?一方は他方よりパイソン的ですか?
解決
基本的にそれは問題ではなく、そのような細部は何かが「Python的」であるかどうかには実際には影響しません。
ただし、トリビアに興味がある場合は、いくつかの違いがあります。
の 組み込みのブール型は Python 2.3 まで存在しませんでした そのため、古いバージョンで実行することを目的としたコードは、
while 1:
形状。たとえば、標準ライブラリで見ることができます。True および False 組み込み関数は次のとおりです。 Python 3 より前の予約語ではない に割り当てて、その値を変更することができます。コードでは次のことができるため、これは上記の場合に役立ちます
True = 1
下位互換性のためですが、名前がTrue
使用するたびにグローバル辞書で検索する必要があります。上記の制限のため、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
より良い方法は、ループの外条件付きブレークで「真ながら」です。