while
前回、文字列や数値をゼロ埋め(ゼロパディング)する方法を勉強しました。
今回はPython(というよりもプログラミングとして)の基礎でやる繰り返し文「while」の使い方を見ていきましょう。
なぜ今頃になって、と思う方もいることでしょう。
私はこれまで繰り返しなら「for文」を使ってきました。
それは「for文」はあらかじめ繰り返す回数が規定されているもので絶対に終わりが来る繰り返しのため、永遠に繰り返すプログラムにはなり得ないからです。
逆に「while文」は永遠に繰り返すことをベースに作られている関数であるため、プログラムがいつまで経っても終わらないという危険が常に付き纏う文です。
もちろんそれによるメリットもありますし、プロの方にとってはそんな恐怖でもないでしょうが、使わないでいけるなら使いたくない気持ちでずっと過ごしてきました。
ですが使わねばどうしようもない状況になったため、重い腰を上げて勉強しようという決心をしたわけです。
それでは始めていきましょう。
while文で永遠に処理するプログラム
とりあえずは基本から、そして永遠に動くプログラムを体験してみることから始めてみます。
ただ永遠に動かす、もしくは止めるのが大変なのは嫌なので、一応対処をしておきます。
作ってみたプログラムがこちら。
import time
a = 0
while True:
print(a)
a = a + 1
time.sleep(1)
実行結果
0
1
2
3
4
5
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
Input In [1], in <cell line: 5>()
6 print(a)
7 a = a + 1
----> 8 time.sleep(1)
KeyboardInterrupt:
「while文」として重要なのは「while True:」以下のところです。
「while文」は「while 条件式:」で条件式が「True」の場合、処理を繰り返します。
そして条件式が「False」になるとそのループから抜ける関数です。
今回は「while True:」、つまり何がどうなっても「True」が返されるため、永遠にループします。
(この条件式以外でもループを止める方法はありますが、それは後ほど)
そして変数aを表示して、aに1を足して次のループに移る。
つまり1回ループすることに1が足された数字が表示されるプログラムになっています。
ただそれだけのプログラムを実行するとプログラムの処理が速すぎて止めるのに苦労します。
そこで「time.sleep(1)」を使い、1秒プログラムを止めることで、プログラムを中止させる余裕を生み出してみます。
条件式でループを抜けてみる
先ほどは永遠とループするプログラムでしたが、次に条件式を使ってループを抜けてみましょう。
今回はaが「1, 2, 3…」と増えていくプログラムですので、a が5になったところでループを抜けるプログラムとしてみましょう。
a = 0
while a < 5:
print(a)
a = a + 1
実行結果
0
1
2
3
4
ここで重要なことですが、条件式は多少外れても必ず止まるように設定するのがオススメです。
例えば今回は「5になったら止まる」なので、条件式がTrueになるには「5でなければTrue」という条件式(a != 5)も書くことができます。
しかし「5でなければTrue」だと、例えば5を飛ばして6になってしまった場合、ループは止まりません。
そうではなくて今回のように「a < 5」、つまり「5未満の場合がTrue」であれば、いきなり値が6になろうが10になろうがループは止まってくれます。
もちろん5になった時だけ止めたい、6や10ではループして欲しいという時もあるので、その場合は「a != 5」でいいと思いますので、目的に合わせてできるだけ広い範囲で止められるように条件式を考えるのがいいでしょう。
breakで止めてみる
先ほどwhile文は条件式でループを止めるとお話ししましたが、それだけではなく「break」というコマンドで止めることも可能です。
その場合は「if文」を使って止めたい条件を分岐させます。
a = 0
while True:
print(a)
a = a + 1
if a >= 5:
break
実行結果
0
1
2
3
4
先ほどの「while 条件式」の条件式では「Trueとなるとループする条件」を書きましたが、「if 条件式: break」の条件式では「Trueになるとループを抜ける条件」を書くのに注意してください。
つまり「while a < 5:」(5未満)の条件と同じ条件は「if a >= 5:」(5以上)となります。
ループを抜けたときに処理するelse
もう一つ「while文」にも「if文」のように「else」が使えます。
while文のelseでは、ループを抜けた後に実行する処理を書きます。
a = 0
while a < 5:
print(a)
a = a + 1
else:
print("finish")
実行結果
0
1
2
3
4
finish
aが5になった時点でループを抜け、elseの「print(“finish”)」が実行されています。
ですがループを抜けたら実行されるのであれば、else文を書かなくても、下に実行したいプログラムを書いておけば良いように思えます。
a = 0
while a < 5:
print(a)
a = a + 1
print("finish")
実行結果
0
1
2
3
4
finish
確かに上記二つのプログラムは実行結果は同じですが、ここに「if break文」が入ってくると話が変わります。
a = 0
while a < 5:
print(a)
a = a + 1
if a == 3:
break
else:
print("finish")
実行結果
0
1
2
whileの条件式はaが5未満、そしてif breakの条件式はaが3です。
この場合、if break文の条件の方が早くくるので、breakでループを抜けることになります。
そしてループを抜けたら、else文の「print(“finish”)」が実行されるはずですが、実行されていません。
つまりif breakでループを抜けた場合にはelse文は実行されないのです。
ということでbreakを使う際に、elseを使うことで、ループを抜けた際の振る舞いを使い分けられるということです。
次回はPandasのデータフレームから1つのデータをランダムで取得する方法を試してみましょう。
ではでは今回はこんな感じで。
コメント