while文の書き方
・while 文の例
・break処理でループを中断する
・break処理で多重ループを抜けるワザ
・比較演算子(==, !=, <=, など…)
・比較するときは変数の型に注意せよ
while 文の例
while文は指定した条件式が真(True)の間、処理を繰り返し実行する。例えば以下のようなスクリプトを実行すると、1から100までを表示した後に”OK.”と表示される。
num = 1 while num <= 100: print(num) num += 1 print("OK.")
コードについて、上から順に説明する。
まず変数 num を定義し、その値を 1 とする。
while文の条件式として「変数 num が100以下」を設定している。これは「numが100以下のときずっと(実行する)」と言い換えられる。
print(num) で num の値を表示。num += 1 で num に1を加算している(インクリメント)。
このwhileの条件の場合、もし num += 1 などのnumを増加させる操作が抜けていると永遠にwhileループからは抜け出せない。このような状態を無限ループと呼ぶ。意図していない無限ループが生じてしまった場合、致命的なバグになってしまう可能性があるので注意が必要である。
break処理でループを中断する
例えば、あるリストの中に特定の文字列が現れるまで、要素を出力し続ける、という処理を考えてみる。このようにループを回す際の条件(回数の上限)が曖昧、もしくは事前に想定しにくい場合には、条件分岐でループを中断するbreak処理が有効である。
例えば次のコードはリスト str の要素の中に eee という文字列が出てくるまでの間ずっと要素を出力する。
num = 0
str = ["aaa", "bbb", "ccc",
"ddd", "eee", "fff",
"ggg", "hhh", "iii"]
while num < len(str):
print(str[num])
if str[num] == "eee":
break
num += 1
print("OK.")
Python は break を読んだ瞬間に while ブロックを抜けるのでifで何らかの例外処理をする場合は必ず break 行の前に書かなければならない(break は if ブロックの最後に書く癖をつけるべし)。
あえて無限ループを利用して break でループを抜けるといった使い方もあるが、もしbreakのある if に引っ掛からなければ永遠にプログラムが終了せずバグの原因となることがある。
break処理で多重ループを抜けるワザ
ある条件に引っ掛かったときに多重ループを一気に抜けたい場面が出てくる。そんなときは else ブロックを追加しておく。
while 条件式: 条件式が真の場合の処理 ... else: 条件式が偽の場合の処理 ...
これを利用すると次のように多重ループを一気に抜けることができる。14行目の「else」はif文にかかってるものではなく、while文にかかっていることに注意。
num1 = 0
int = [10, 20, 30,
40, 50, 60]
str = ["aaa", "bbb", "ccc",
"ddd", "eee", "fff"]
while num1 < len(int):
num2 = 0
while num2 < len(str):
print(str[num1],int[num2])
if str[num1] == "bbb" and int[num2] == 30:
print("BREAK")
break
num2 += 1
else:
num1 += 1
continue
break
このように書くと、2つ目のwhileが正常に終了した場合は else ブロックの処理が始まるが、2つ目のwhileが break された場合は else ブロックは読まれず(13行目の「num2 += 1」から読まれない)、さらに17行目のbreakによって1つ目のwhileから脱出する。
なお、Python は continue を読んだ瞬間に else ブロックを抜けるので、num1 += 1 などのインクリメント操作はcontinueの前に書かなければならない(continue は一番最後に書くようにすること)。
比較演算子(==, !=, <=, など…)
2つの値を比較演算子によって評価することができる。
比較演算子 | 意味 |
---|---|
a < b | a は b より小さい |
a <= b | a は b 以下 |
a > b | a は bより大きいい |
a >= b | a は b 以上 |
a == b | a は b に等しい |
a != b | a は b に不一致 |
これらは True または False を返す。例えば、
print (5 < 9)
というスクリプトは “True” を返す。
要するに、while 文の条件式では “True” or “False” を判定しているだけである。if 文も同様である。
比較するときは変数の型に注意せよ
比較演算子によって値を評価する際は変数の型に注意する必要がある。例えば、
print (5 == 5) # True
というスクリプトは “True” を返すが、
print ("5" == 5)
# False
と書いた場合は “False” を返す。(左辺の5がダブルクォーテーションで囲まれていることに注意)
これは “5” が文字列を表しているためである。一方で右辺の 5 は整数型であり、これはいかなる文字列とも等しくなることがない。そのためFalseと判断される。
等号で比較する場合は大抵のプログラマは気を付けるのであるが、これが「<」や「>」などになると何故か途端に注意散漫になりバグを生み出すようになる。
Pythonに限ったことではないが、比較演算子によって値を評価する際は変数の型に気を配るようにしよう。変数の型変換については「§ 数値⇔文字列の型変換」のセクションを参照のこと。評価する変数が文字列の場合は「文字列が数値かどうか判定する方法」のページも参考に。