next up previous
Next: 2 重のループ Up: プログラミング入門 Previous: 繰り返し

   
while 文

繰り返しを行なうときの, 基本的な方法として, while 文を 用いるということがあります. while 文は, ある条件が成立 する間, 指定されたブロック(文の集まり)を繰り返し実行 します. while 文は以下のような形式になっています.
while 条件:
    ブロック
プログラムにおいて while 文を実行する部分に到達すると, 条件をみたしているか どうかを判定します. もし, 条件をみたしていないなら, ブロックを実行しない で, この部分の次の部分にプログラムが進みます(つまり while 文やブロック の部分を終了し次の部分へと進みます). もし, 条件をみたしているな ら, ブロックの部分が実行され, 再び while の部分に戻ります. ここで, 再び 条件をみたしているかどうかを判定し, みたしていないのなら, ブロックを実行 せずに, while 文とブロックの部分を終了して次の部分に進み, 条件を満たして いるのなら, ブロックを実行して while のところに戻ります. 以下, 条件が みたされないような状況になるまで, 繰り返し(ループ)を行ないます.

ここで条件文ですが, とりあえず数値の比較について以下にあげておこう:

Python の記法 意味
< <
> >
== =
<= $\leq$
>= $\geq$
!= $\ne$

セクション 4.3 の例を while 文を 用いて書いてみましょう.

# while 文の例 1
i = 1
while i <= 5:
    print 'Hello, world!'
    i = i + 1
これは, スクリプトです. 対話的に実行する場合については後に述べます. 1 行目はコメントです. 2 行目で i に値 1 を代入します. 3 行目に while 文 が現れます. 「i <= 5」 は条件で, 前述の表にあるとおり, $i \le 5$ を意味します. また, while の行はコロン「:」で終了します. 4 行目と 5 行目が繰り返される ブロックです. ブロックはスペースかタブで字下げすることで表現されます. この場合, 字下げの深さをそろえておきます. また, 目には見えませんが, 最後の行(5 行目)は改行されて終了しています.

この例では, 最初に i に 値 1 が代入されます. 次に, 繰り返しのブロックを 実行するか判定します. i=1 は $i \le 5$ をみたしますから, 繰り返しの ブロックが実行されます. このブロックでは, 'Hello, world!' と印字し, 次に, i に i + 1 の値(今の場合 i+1=2)が代入されます. そうして, i=2 となり, 3 行目の while 以下の条件の判定に戻ります. まだ, 条件 $i \le 5$ はみたされますから, 再びブロックが実行され, 印字をし, i の値が 1 増えます. このブロックの繰り返しは i の値が 5 になるまで繰り返されます. 5 回ブロックを繰り返すと, i の値は 6 に なり, 条件をみたさなくなりますから, ブロックの繰り返しを終了します.

ところで, このプログラムが 4 行目で終了していたとしたら, つまり, 5 行目の「i = i + 1」が無ければどうなるでしょう. 何度ブロックを 繰り返しても, i の値は 1 のままで, 繰り返しを止めるきっかけが無くなり, プログラムはいつまでも,「Hello, world!」と印字を続けることになります. このような繰り返しを「無限ループ」とも言いますが, プログラムを 作成するときには, 無限ループにならないように, 充分に注意する必要 があります.

上の例を対話的に実行してみましょう.

>>> i = 1
>>> while i <= 5:
...   print 'Hello, world'
...   i = i + 1
... 
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
while の行を入力すると, プロンプトが「>>>」から「...」に変わります. ここではブロックは 2 つのスペースで字下げしています(字下げは揃っていれば 幾つのスペースを用いても構いません). 対話的に実行する場合には, ブロックが終った後, 「...」プロンプトで行に何も書かずに改行することで, ループが実行されます.

さて, 上の例(例 1)では, 変数 i は, ループが何回目かを数えるのに使っています. この i をループのカウンタと言います. ループのカウンタをもう少し 使ってみましょう.

# while の例 2
times = 5
i = 1
print times, '回繰り返します'
while i <= times:
    print i, '回目: Hello!'
    i = i + 1
print times, '回繰り返しました。'

この例は, 先の例よりもほんの少しだけ複雑です. 繰り返し回数を変数 times に 代入し, 繰り返しの前と後に, 繰り返し回数を出力しています. この場合, 変数 times を使うことにより, 繰り返し回数を変更する 時に, 1 箇所(最初の行)のみを変更するだけで済みます. もしも, 変数 times を使わないで同じプログラムを書くと,

# while の例 3
i = 1
print 5, '回繰り返します'
while i <= 5:
    print i, '回目: Hello!'
    i = i + 1
print 5, '回繰り返しました。'
となり, 例えば 7 回繰り返すようにプログラムを変更する時には, 3 箇所 の 5 をすべて 7 に変更する必要が出て来ます.

while の例 2 では, "Hello" をプリントするときに, 何回目かを 一緒に表示するようにも変更しています. print で 2 つ以上のデータ (この場合, 整数値と文字列)を出力する場合, 「,」で区切って並べます. 例 2 では, 4 行目と 8 行目でもこのような書き方をしています.

では, 次にループのカウンタを使って簡単な計算をしてみましょう. 次のプログラムは九九のひとつの段を印字します:

# while の例 4
# 九九の一段を印字
dan = 5
max = 9
i = 1
while i <= max:
    print i * dan,
    i = i + 1
print
どの段を計算するかを変数 dan に代入しています. i $\times$ dan を 計算するのですが, i をいくつまで計算するかを変数 max に代入しています. (九九ですから, 普通 max は 9 です.)

ここでは, print 文は「,」で終っています. こうすると, print 文が 終了しても改行せずに, 次のデータは空白を空けて右に印字されます. (最後の print は改行のためにつけています. この行がある場合と ない場合で, 実行結果がどう違うかを比べてみてください.)



Toru Sasaki
2000-08-30