Pythonでwhile文を書く
while文とは?
while文は条件が満たされている間は繰り返し処理を実行するコードです。実行中に処理をスキップしたり、中断することも可能です。
while文の処理構造
条件は理論式で記述し、結果がTrueならwhile文内の処理を実行します。この処理は条件の結果がFalseまたはbreakになるまで実行を繰り返します。
while文の書き方
コードの書き方は前回の記事で紹介したif文と似ており、「while 条件式 :」と記述し、改行して先頭に半角スペース4つのインデントを入れ、ステートメントを書きます。
while 条件式1:
条件を満たすときの処理A #先頭に半角スペース4つ
インデント入れずにステートメント#while文が終了
while文の記述例
実際にwhile文を使ってコードを書いてみます。
randomモジュールのrandint関数を読み込み、変数aが50以上になるまで、変数bで取得した乱数を足し続けるコードを作ってみましょう。
複合代入演算子(+=の部分)についてはこちらの記事を参考にしてください。
#while文を使った記述例
from random import randint
a = 0
while a <= 50 :
b = randint(1, 10)
print(b)
a += b
print("合計" + str(a))
コードが書けたので実行してみます。
#コードの実行結果
4
9
10
4
10
5
1
4
5
合計52
このように変数aの値が合計50以上になるまで足し算が繰り返された処理結果が表示されます(乱数を生成しているので、まったく同じ数値になっていなくて大丈夫です)。
続いて、もう少し複雑なコードを書いてみます。
randomモジュールのrandint関数を読み込み、変数usdjpyに80~120間の乱数を生成し、変数positionに加算します。変数pyramidingが0になるまで(5回)ループ処理し、最後に変数positionの平均値を表示させます。
#while文を使った記述例
from random import randint
position = 0
pyramiding = 5 #ループする回数
tradecout = pyramiding #平均値計算用
#pyramidingが0になるまで繰り返す
while pyramiding>0 :
usdjpy = randint(80,120)
print(usdjpy)
position += usdjpy
pyramiding -= 1 #pyramidingを1減らす
#出力
print("-"*5) #見やすいように区切りを入れる
print("ポジション平均価格"+str(position/tradecout)+"円")
上記コードを実行してみましょう。
#コードの実行結果
112
107
101
105
115
-----
ポジション平均価格108.0円
乱数で5回取得した平均値が表示されました。
Pythonでwhile文を中断する:break
while文では終了ではなく、ループ処理を中断することもできます。終了と中断の違いは、終了は条件1を満たした場合にループ処理を抜けるのに対して、中断は条件1とは別に設定した中断条件に合致したとき、割り込み的に処理を終了させます。下の処理構造を見るとbreakは条件1の理論式で判定を経由せず、処理Aからループ処理を抜けていることがわかります。
値が一致したときにループ処理を抜ける
breakを使ったコードを作成してみます。次のコードは変数a,b,cに0~20の乱数を生成し、3つの合計値が30になる組み合わせになるまで処理を繰り返します。合計値が30になったらループ処理を抜けてそれぞれの変数の値を表示させます。
#breakコードの記述例
from random import randint
while True :
a = randint(0, 20)
b = randint(0, 20)
c = randint(0, 20)
if(a + b + c) == 30 :
break
print(a, b, c)
print(a + b + c)
コードを実行してみます。
13 12 5
30
このように変数a,b,cの合計値が30になる値が表示されました。
Pythonでwhile文の処理をスキップする:continue
先ほどのbreakはループ処理を終了するのに対して、continueは実行中の処理をスキップしてループ処理を継続します。
値が重複している場合はスキップする
continueを使って「重複しない整数が5つ入ったリストを作成する」コードを作ってみます。変数numにrandint関数を使って0~10の乱数を生成し、リストboxに重複した値がなければリストに数値を加えます。重複している場合はリストに加えず(スキップ)、変数numに乱数を生成する処理に戻り、リストに5つの整数が加わればループ処理を終了します。
リストについては他の記事で詳しく解説します。
#continueコードの記述例
from random import randint
box = []
while len(box) < 5 :
num = randint(0, 10)
if num in box :
continue
box.append(num)
print(box)
コードを実行してみます。
[9, 6, 4, 3, 8]
このように1~10の整数から重複しない値のリストを作成することができました(乱数を生成しているので、まったく同じ数値になっていなくて大丈夫です)。
Pythonでループ処理後に処理を加える:while ~ else
while文では結果がTrueならwhile文内の処理をループして、結果がFalseならwhile文を終了します。if文で解説したif ~ elseのようにwhile文でもelseを使って、結果がFalseの時に処理を加えることが可能です。また、下の図の様にbreakした場合はelseの処理は実行されません。
特定の値が出たら処理を中断する
先ほどのコードにbreakと組み合わせてelseを追加してみます。変数numが0となった場合、処理を中断し「中断」と表示させます。処理が中断せずに終了した場合、リストboxを表示させます。
#while ~ elseコードの記述例
from random import randint
box = []
while len(box) < 5 :
num = randint(0, 10)
if num == 0 :
print("中断")
break
if num in box :
continue
box.append(num)
else :
print(box)
コードを実行してみます。
[1, 9, 4, 10, 5]
中断せずに処理が終了した場合、1~10の整数が5つ入ったリストが表示されます。
中断
処理が中断した場合、リストが表示さず「中断」と表示されます。
今回のまとめ
・while文は結果がTrue:処理を継続、結果がFalse:処理を終了
・ループ処理を中断させるにはbreak
・ループ処理の結果をスキップし、処理を継続するにはcontinue
・while文の結果がFalseの場合に実行する処理を追加するにはelse
コメント