Pythonでwhile文を使って、処理を繰り返す方法について書いています。
最初にwhile文の説明を簡単にして、実際のコードを元に解説しています。
載せているコードはPythonのバージョン3.9.12で確認しました。
公式ドキュメントにはこの辺に記載があります。
Pythonのwhile文とは?どう書く?
while文は条件式が成り立つ(Trueになる)場合に、処理を繰り返します。
例えば、下記のように使うことが可能です。
count = 0
while count < 10:
print("hello, world!")
count += 1
上記では、10回「hello, world!」を出力するようにしました。
最初にcount変数に0を代入しています。
その後にwhile文が登場します。
条件文をcount < 10
としているので、count変数の値が9まではループを実行してくれます。
while文も条件を書いた後には、コロン(:
)をつけます。
条件文の配下の処理ブロックが、ループ処理で繰り返し処理してくれる内容になります。
今回は、print関数で”hello, world!”を出力しています。
その後にcount変数をひとつずつカウントアップします。
count変数は最初0ですが、カウントが上がるたびに「0, 1, 2, 3…」と上がっていきます。
10になった時点で、条件文とあわなくなるので、処理を抜けます。
つまり、上記のコードでは0から9までの10回「hello, world」を出力して、処理を抜けます。
無限ループについて
while文などの繰り返し処理で無限ループが起こることがあります。
無限ループは条件式を抜ける処理が実行されずに、繰り返し処理がずっと続くことです。
上記のコードで説明すると、count変数をカウントアップし忘れて、条件文を抜けれなくなったとします。
そうすると無限ループしてしまって、ずっと処理が繰り返されてしまうので、条件文の付け方やカウント値には気をつけましょう。
無限ループしてしまった場合に、ターミナルから抜ける場合は「Control + C」を押すと抜けることができます。
for文とwhile文の違いは?
for文ではリストを使ったり、range関数を使うことで、何回実行されるかがきまっていました。(リストの要素数やrangeに渡す引数で)
while文は条件文しかないため、前項で説明したように無限ループが起こる可能性があります。
バグを作らないためにも、リストを使える時や実行回数が決めれる場合は、for文を積極的に使っていくほうが良いでしょう。
while文をスキップするcontinueについて
while文で処理をスキップしたい場合にはcontinueを使います。
continueを使うと、continueが呼び出された以降の処理は実行せずに、while文の先頭に戻って処理が再開されます。
例えば、下記のようなコードです。
count = 0
while count < 10:
if count == 3 or count == 5 or count == 7:
count += 1
continue
print("hello" + str(count))
count += 1
最初のコードにスキップする処理を追加しました。
count変数をwhile文でカウントアップしていますが、値が「3・5・7」のときにcontinueするようにしています。
処理の流れとしては、最初はカウント0で「hello0」が出力されて、次はカウント1で「hello1」が出力されて…といった流れで
カウント3の時にcount変数をカウントアップした後に、continueを実行して、処理の最初に戻ります。
そのため「hello3」は出力されません。
結果として「3・5・7」が出力されずに、下記のような出力になります。
hello0
hello1
hello2
hello4
hello6
hello8
hello9
while文を抜けるbreakについて
while文で処理を抜ける場合にはbreakを使います。
breakを使うと、呼び出された瞬間に繰り返し(ループ)処理を抜けます。
呼び出された後は、ループ内のコードブロックは実行されません。
例えば、下記のようなコードです。
count = 0
while count < 10:
if count == 3:
break
print("hello" + str(count))
count += 1
最初のコードにbreakする処理を入れました。
count変数の値が3になった時にbreakして、処理を抜けます。
「hello0, hello1, hello2」と出力されて、count変数が3になります。
処理の先頭に戻った時にcount == 3
が成り立つので、breakを実行してループを抜けて、繰り返し処理が終わります。
このコードでの出力結果は下記のようになります。
hello0
hello1
hello2
while文の最後に実行されるelse文
while文で繰り返し(ループ)処理の最後に行いたい処理がある場合は、else文を書くようにします。
条件が成立する(True)間にはwhile文のループ処理が行われて、成立しなくなる(False)場合にelse文の配下のコードブロックが実行されます。
例えば、下記のように実行します。
count = 0
while count < 3:
print("hello" + str(count))
count += 1
else:
print("処理終了")
count変数に0を入れて、3未満の間(0, 1, 2)のときにループ処理をします。
ループ処理の中では「hello0」のように”hello”とcount変数を結合した文字列を出力しています。
ループが終わると、else文の処理が実行されて、「処理終了」が出力されます。
そのため、このコードで出力される内容は下記のようになります。
hello0
hello1
hello2
処理終了
else文はパッと見ると、下記のようにwhile文が終わった後に処理を書けば良いと思うかもしれません。
count = 0
while count < 3:
print("hello" + str(count))
count += 1
print("処理終了")
実際に、上記のコードでも出力内容は変わりません。
ですが、breakをwhileに入れたときには挙動が変わってきます。
breakされた後にループを抜けますが、その時にはelseの処理は行われません。
なので、下記のようにコードを書くと、elseの処理は行われずに処理が終わります。
count = 0
while count < 3:
if count == 2:
break
print("hello" + str(count))
count += 1
else:
print("処理終了")
count変数の値が2になったらbreakするようにしています。
このコードで出力される内容は下記です。
hello0
hello1
このようにbreakした場合にはelse配下の処理は実行されません。
breakした時には処理を行いたくないけど、通常パターンでループした最後に実行したい内容がある場合には使うと良いと思います。
コメント