Python入門|while文を使った繰り返し処理の基本のイメージ画像

Python入門|while文を使った繰り返し処理の基本

  • 公開日:2018/06/21
  • 更新日:2018/10/19
  • 投稿者:n bit

Pythonのwhile文は条件判定式を利用してループ処理を行います。同じように繰り返し処理が行えるfor文とはまた違った繰り返し処理を行うことができるのがwhile文です。特に無限ループや、その抜け方、そして基本的な特徴やwhile文の書き方等について学習します。

  • Python

この記事は約 分で読めます。(文字)

while文による繰り返し処理

while文の繰り返し処理は終わりが決まっていない同じ処理を繰り返し行うとき主に利用します。whileは英語で「〜の間」という意味がありますが、ある一定の条件が満たされている間は永遠と同じ処理を繰り返します

日常生活などで例えるなら椅子取りゲームなどが分かりやすいと思います。椅子の周りをぐるぐると回る行動が開始され、笛の音が鳴るまでは永遠とこの作業を繰り返していますよね。

ここで、ある一定の条件と言うのは「笛が鳴る」に該当し、参加者は「椅子の周りをぐるぐると回る」と言う処理を繰り返しているのです。

  • 終わりが決まっていない同じ処理の繰り返し:椅子の周りをぐるぐると回る
  • ある一定の条件:笛が鳴る

笛がなればその行動が終わりと言うように、不規則なタイミングで発せられる特定条件によって終わりが決まります。あらかじめ何分回るとか、何回回るといった感じではゴールが定められていません。

日常生活における繰り返し処理

  • 椅子を中心に周りをぐるぐると回り始める
  • 笛が鳴る
  • 椅子の周りを回ることをやめて着席する

Python:while文日常的なループ

ではこの日常生活をプログラミング処理に置き換えるとどうなるでしょうか。プログラミング処理である一定の条件が満たされているかどうかの判定にはbool型が利用されていましたよね。bool型の「True」、または、「False」によってwhile文の繰り返し処理の終了タイミングも判定しています。

プログラミングにおける繰り返し処理

  • 「True」なら座標(\(x\), \(y\))を中心に回転処理開始
  • 判定条件が「False」に変更
  • 回転処理(繰り返し処理)を終了

Python:while文プログラミング的なループ

while文の繰り返し処理ではbool型による条件判定が入っていることがポイントです。

while文の繰り返し処理フローチャート

ではこの動きをフローチャートで表してみましょう。1連の流れを言語化したものが3行であったことからもわかるように図式化してもwhileのプログラミング処理の流れはとてもシンプルになります。

Python:while文フローチャート

フローチャート記号一覧

記号記号の意味説明
フローチャート記号:開始と終了開始/終了角丸の四角形でプログムの開始や終了を表す記号です。
フローチャート記号:入力と出力入力/出力平行四辺形でデータの入出力を表す記号です。
フローチャート記号:実行処理実行処理四角形でプログラムの実行処理を表す記号です。
フローチャート記号:条件分岐条件分岐菱形で条件の分岐を表す記号です。
フローチャート記号:ループ開始ループ開始ループ処理の開始を表す記号です。
フローチャート記号:ループ終了ループ終了ループ処理の終了を表す記号です。

フローチャートの基本的な扱い方について忘れてしまった方はこちらのページで解説しているので復習しておいてください。

while文の記述方法

while文の記述方法は最初に【while】を書き、その後に【条件判定式】を記述し、同じ行の最後にコロン【:】をつけてwhile文の1行目が完了です。

2行目以降はif文やfor文と同じでインデントを行い実行処理をブロックの中に記述していきます。

Python:while文記述の構造

それでは実際にwhile文の基本構文を表したコードを記述していきましょう。今回は説明のためランダムに数値を生成出来るPythonの「randrange関数」を利用しています。本編の解説にあまり関係がありませんので詳しい説明は省きます。

Note

関数と引数とは

「関数」とは「何かしらの入力に対して、決まった規則に従った出力を行う機能をもったもの」です。そして関数に渡す何かしらの入力値のことを「引数」と呼びます。

randrange関数を利用出来る様に最初に下記の1行を追加しておいてください。

from random import randrange

こちらは「randrange関数を利用出来る様にするためコード」ぐらいで理解しておけば大丈夫です。

randrange関数を下記の様に指定すると0〜9の整数をランダムに出力します。

from random import randrange


print(randrange(0, 10, 1))

出力結果

3

試しに何度か実行して頂ければ整数値がランダムに出力されているのがわかります。

randrange関数を使ってwhile文の基本的な構造を記述してみましょう。

from random import randrange


x = randrange(0, 10, 1)
while x <= 8:
print(x)
x = randrange(0, 10, 1)

出力結果

4

6
5
1
8
2
0
7

こちらの処理では変数\(x\)にrandrange関数から0〜9の整数をランダムに取得し、条件式で8以下かどうかを判定させています。8以下であればループを開始し、print関数で変数\(x\)の値を出力、その後、再度変数\(x\)にrandrange関数からランダム整数値を取得する実行処理を、8より大きな数値が出るまで永遠に続けます。

出力結果を見ると最後に出力されている数値は7で、そこでループが終了していますので、その次のランダム値は9だったと予想できます。(0〜9の整数で8より大きな数値は9しかないため。)

判定条件にある8より大きな数値の数がいつ出現するかは事前にはわかりません。そのため、ある一定の条件が満たされている間(変数\(x\)の値が8以下の間)は永遠と同じ処理を繰り返すwhile文が適しています。

直接while文に「True」を指定する無限ループ

while文の利用においては次に説明するパターンもプログラミングの中で利用頻度が高いです。while文の書き方事例ではwhileの後に条件式をつけましたが直接「True」を指定することで強制的に無限ループを作ることができます。

無限ループとはそのままで永遠にループを繰り返す処理を指します。こちらの方が最初の椅子取りゲームの話のイメージにより近いコードの構造とも言えますね。とりあえず永遠とループすることだけが決まっていて、ある条件が発動する(笛がなる)まで処理を繰り返し続けます。

コードの書き方は【while】の後に直接【True】を指定して行の最後にコロン【:】を記述します。

from random import randrange


x = randrange(0, 10, 1)
flag = True
while flag:
print(x)

出力結果

3

7
6



0
8
0

無限ループですので出力結果を確認すると永遠と0〜9の整数が出力されていることが確認できます。ターミナル等で実行してしまった場合は【control + c】を押して手動で強制的に無限ループ処理を終了してください。

while文の無限ループ処理をbreak文で抜ける方法

無限ループの動作としては正常ですがプログラムの処理が終わることがなくなりますのでプログラムの処理上問題がありますよね。そこで登場するのがbreak文です。break文を記述するとその時点で強制的にこのループ処理を終了させることができます。

私に先程の無限ループにbreak文を試しに記述してみましょう。

from random import randrange


x = randrange(0, 10, 1)
flag = True
while flag:
print(x)
break

出力結果

6

出力結果を確認すると強制的に一回目のループで無限ループ処理が終了していることが確認できます。このようにbreak文を記述したところで強制的にループを終了させます。

このままではわざわざ無限ループを作った意味がありませんので、次は無限ループの中で条件判定を作成し条件に合致した時のみbreak文で無限ループを抜けるように変更します。

while文内でif文によってbreak文を発動させ無限ループを抜ける方法

無限ループの中にif文を記述することで無限ループ内に新たな条件判定を作成しbreak文の発行タイミングを任意でコントロールすることができるようになります。

from random import randrange


x = randrange(0, 10, 1)
flag = True
while flag:
print(x)
if x > 8:
break
else:
x = randrange(0, 10, 1)

出力結果

1

6
0
8
0
3
9

if・elseを使って変数\(x\)が8より大きな値の場合はbreak、それ以外の値の時は変数\(x\)に再度0から9のランダムな整数値を渡します。出力結果を見ると、最後の変数\(x\)の値が9だったため、ループ処理が終了になっていることを確認できます。

先程の条件式でループさせた時とよく似ていますが1点違うのはループ処理が開始される前に変数\(x\)に代入されたランダム値が9であってもとりあえずループが開始されることです。

先程の条件式での判定の場合はループ処理前の変数\(x\)に代入される値が9であった場合はループ処理が開始されることもありません。

とにかく一度強制的にループ処理を回してしまいたい場合にはこのパターンがとても有効的です。

今日のdot

while文は、あらかじめ終わりが決まっていない同じ処理の繰り返しを主に扱います。bool型の値が「False」になるか、break文で強制的にループを抜けるまで永遠と同じ処理を繰り返します

while文に「条件式」を指定し、ループを「False」で抜ける

from random import randrange


x = randrange(0, 10, 1)
while x <= 8:
print(x)
x = randrange(0, 10, 1)

出力結果

4

1
3
5
3

while文に「True」を指定し、無限ループはbreak文で抜ける

from random import randrange


x = randrange(0, 10, 1)
flag = True
while flag:
print(x)
if x > 8:
break
else:
x = randrange(0, 10, 1)

出力結果

0

3
6
6
9