このページでは、while文で「while True:」と書いた時の無限ループの書き方と、その注意点について、図解を多く入れながら解説していきます。ぜひ参考にして頂ければと思います。
while文の基本については「Pythonのwhile文による繰り返し処理(whileループ)の基本」で解説しています。先に目を通しておきましょう。
1. while True(無限ループ)とは
while文は「ある条件を満たす間(Trueの間)、指定の処理を繰り返す」というものです。つまり条件が常にTrue(=真)であれば、指定の処理を永遠に繰り返す無限ループになるということです。Pythonでは、そのような無限ループを作りたい時は、次のように「while True」と書きます。
while True:
処理文
これで常に条件がTrue(=真)となり、下図のような無限ループになります。
ただし、このまま例えば次のようなコードを書くと、0から1ずつ増えていく数値を永遠に出力し続けてしまいます。
num = 0
while True:
print(num)
num += 1
この処理の流れは下図の通りです。
このままでは永遠にwhileブロックの次に進むことはできませんし、コンピューターに多大な負担をかけてしまいます。
そのため、無限ループは必ずbreak(中断条件)とセットで使います。次のコードでは、先ほどのものに中断条件を入れたので、ちゃんと無限ループが終了しています。ちなみに、breakについては「Pythonのwhile文のbreakを使ったループ条件の作り方」でご確認ください。
num = 0
while True:
print(num)
num += 1
if num == 6:
break
この処理の流れは下図の通りです。
2. PythonでTrueと判定されるケース
ここまでは条件式の「While True:」=「無限ループ」として解説してきました。これは「whileループの繰り返し条件が常にTrueですよ」という意味です。そのため無限ループになるのですね。
さて、実は常にTrueと判定されるケースはこの限りではありません。これを知っておかないと、意図せず無限ループを作ってしまうかもしれないので、ここで解説しておきたいと思います。
通常、条件式を書くときは比較演算子を使います。比較演算子は実行すると、以下のように必ずTrueかFalseを返します。
print(1 == 1)
print(1 != 1)
print(1 < 2)
これは分かりやすいので混乱しないですね。
しかし、奇妙に聞こえるかもしれませんが、実は、オブジェクトにもTrueかFalseかのブール値があるのです。そしてデータのあるオブジェクトは全て、以下のようにTrueと判定されます。
list = [1, 2, 3]
str = '1, 2, 3'
print(bool(list))
print(bool(str))
つまり「while list:」と書いたり、「while str:」と書いたり、「while 1:」と書いたりした時も、それらは「while True:」と同じ意味になるのです。
比較演算子以外でFalseと判定されるのは、次の4つのケースのみです。
- ブール値としてのFalse
- None(null)
- 数値の0(整数:0、浮動小数点数:0.0、複素数:0j)
- 空の文字列、リスト、タプル、辞書
以下のコードで実際に確認してみましょう。
print(bool()) # Noneの場合
print(bool(0)) # 数値の0(浮動小数点数含む)の場合
print(bool('')) # 空の文字列の場合
print(bool([])) # 空のコンテナ(リスト、タプル、辞書など)の場合
このため、例えば「while 0:」や「while ”:」などと書くと、whileループの条件式は常にFalseとなるのです。
これと同じことは「Pythonのif文を使った条件分岐の基本と応用」でさらに詳しく解説しているので、一緒に読んで、ぜひ理解を深めておきましょう。
3. 意図せぬ無限ループを中断する方法
無限ループの注意点について解説しましたが、それでももし、意図せず無限ループになってしまった場合は、「ctrl + c」で KeyboardInterruptという強制終了をすることができますので覚えておきましょう。
num = 1
while True:
print(num)
num += 1
4. まとめ
Pythonでは「while True:」と書くと無限ループになります。無限ループがあると、コードが先に進めなくなるため、ほぼbreakとセットで使うということを覚えておきましょう。
また、Pythonのブール値(True or False)の判定についても抑えておきましょう。Pythonではオブジェクトもブール値があり、Falseと判定されるのは4つのケースだけです。
これらの点を理解した上で、ぜひ無限ループをマスターしてください!
コメント