「ある条件が正しければ一定の処理を繰り返す」
ということができます。
そのために使うのが「while」です。
while 条件文:
____実行処理
という書き方の方が便利な時があります。
条件文がTrueである限り
実行処理が続きます。
例えば
a = 0
while a < 3:
print(a)
a = a + 1
0
1
2
という結果になります。
実際に行われている計算の流れを見ると、
a = 0
0 < 3 (True)
print(0) >> 0が出力
a = 0 + 1 (aに新しく1が入る)
1 < 3 (True)
(whileに戻る)
1 < 3 (True)
print(1) >> 1が出力
a = 1 + 1 (aに新しく2が入る)
(whileに戻る)
2 < 3 (True)
print(2) >> 2が出力
a = 2 + 1 (aに新しく3が入る)
(whileに戻る)
2 < 3 (False)
Falseのため終了
という構造です。
ここで
a = a + 1は
a += 1
と書くことができます。
同じ式の中で変数が2つあるよりわかりやすいですね。
書き換えると
a = 0
while a < 3:
print(a)
a += 1
です。
この構文で
a += 1
を忘れてしまうと、aは永遠に0なので
a = 0
while a < 3:
print(a)
0
0
0
・
・
・
となり永久に続きます。
「コントロールキー + C」
で強制的にストップできます。
条件とbreakを使う
while True:
____実行処理
とすると、whileの条件はTrueであり続けるため、
実行処理が延々と繰り返されます。
ここで
「break」
を実行するとwhileの外へ出ることができます。
このbreakはifとセットで使うことが多いです。
while True:
____実行処理
____if 条件:
________break
としておくと、
実行処理を行ったあとに、
条件を満たすとbreak、つまりwhileの外に出ます。
例えば
a = 0
while True:
print(a)
if a > 1:
break
a += 1
print('処理終了')
を実行すると
0
1
2
処理終了
となります。
これは順を追ってみると
a = 0
while True: Trueなのでwhile内を実行
print(a) >> 0を出力
if a > 1: 0 > 1はFalseなのでif以下は実行せず
a += 1 >> aに1を代入
while True: Trueなのでwhile内を実行
print(a) >> 1を出力
if a > 1: 1 > 1はFalseなのでif以下は実行せず
a += 1 >> aに2を代入
while True: Trueなのでwhile内を実行
print(a) >> 2を出力
if a > 1: 2 > 1はTrueなのでif内を実行
break : whileの外へ
print('処理終了') : 処理終了を出力
と、条件を満たしたときにwhileの外へでて無事処理が終了されます。
whileでのファイルの読み取り
whileの条件はifのときと同じく、
Falseであれば実行をやめて次に行きますが、これは
条件が'', [], {}など空のものでも
実行をやめて外に出ます。
この事を利用してwhileはファイルの読み取りにも使えます。
例えば簡単なテキストファイル
1行目
2行目
3行目で終わり
を作ります。
openとしてファイルを開きます。
f = open('test.txt', 'r')
readline()
で行を1行ずつ読んでいきます。
f.readline()
# '1行目\n'
f.readline()
# '2行目\n'
f.readline()
# '3行目で終わり\n'
f.readline()
# ''
f.readline()
# ''
と1行ずつファイルの中身を読み出していきます。
最後まで行くと、''を出力し続けます。
このことを利用してwhile文と組み合わせてファイルの読み取りを行います。
f = open('test.txt', 'r')
line = f.readline()
while line:
print(line[:-1])
line = f.readline()
f.close()
1行目
2行目
3行目で終わり
となり、終了します。
構造としては
f = open('test.csv', 'r')
line = f.readline() # lineに'1行目\n'が入る
while line: # lineは''ではないのでwhile内の処理を実行
print(line[:-1]) # '1行目'を出力
line = f.readline() # lineに'2行目\n'が入る
while line: # lineは''ではないのでwhile内処理実行
print(line[:-1]) # '2行目'を出力
line = f.readline() # lineに'3行目で終わり\n'が入る
while line: # lineは''ではないのでwhile内処理実行
print(line[:-1]) # '3行目で終わり'を出力
line = f.readline() # lineに''が入る
while line: # lineが''のためwhile内の処理せず終了
f.close() #ファイル閉じる
です。
これは1行ずつ読み出してデータを入力する場合などに有効な手段です。