これらはすべて技術的に異なります。
今
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)
を、唯一while1
とwhile2
は終了します。 bool(None)
はFalse
となるので、while3
は無限に続きますが、None != False
とNone is not False
のため、while1
とwhile2
の両方が終了します。
ここでは、もっと複雑な例を使用すると面白くなります。今
例2
def fun(x):
return x
、当社の各ループのために、我々はflag = fun(0)
にflag = fun()
を変更しようとしています。
この場合、while1
とwhile3
は終了し、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 x
はx == b
またはx is b
に好適です。
最後に... whileループ
あなたは、常にforループにwhileループを変換することができます。これは常に可能ではありませんが、単純なケースをしたいと言う:
x = 0
while x < 10:
print(x)
x -= 1
これは、に変換することができます。
for x in range(10):
print(x)
ループのために使用するのではなく理由をループは、いくつかの場合である一方、あなたのコードでエラーが発生しますが、ループは無限ループに陥り、プログラムをクラッシュさせますが、forループは常に終了します。
whileループの条件で意図を明確にしたい場合は、 'didnt_break_yet = lambda:True'を作成し、' while didnt_break_yet():#Do something'のように使用します。そうすれば、ループが無限に長く実行されることはありません* – WorldSEnder
あなたの個人的な好みが何であれ、複数のオプションがある場合は、コードの文脈でどのようなものを使っても構いません。 –