Python

条件下での繰り返し while

「ある条件が正しければ一定の処理を繰り返す」
ということができます。
そのために使うのが「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はファイルの読み取りにも使えます。

例えば簡単なテキストファイル

test.txt

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行ずつ読み出してデータを入力する場合などに有効な手段です。