Python入門(5) 繰り返し文

プログラミングにおいて、なんども同様の処理を繰り返すfor文またはwhile文が必要になる。 while文があればfor文は不要であるが、for文は多用される。

for文: 決まった回数だけ繰り返す

ブロック指定されたプログラム単位をキーワード for を使ったfor文で、指定した回数だけ繰り返すことができる。 for文ではカウター変数(counter)の値を範囲指定し、カウンタを(デフォルトでは)1つずつ移動しながらブロック単位を繰り返す。

次の構文は、カウンタ変数を i がtrange関数で指定したカウンタ値の範囲 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] を値 1 から始めて 10 まで1つずつ移動しながら、文1か文nまでを10回繰り返す。
for i in range(1, 11):
    文1
    ....
    文n

2つの点に注意して欲しい。

次のスクリプト for.py を見てみよう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

for i in range(1, 11):
    print "value of i :", i,
    print "\tcaliculating i ** 3: ", i ** 3
print "This is out of for block"

7行目はfor文の外にあることに注意。 実行結果は次のようになる。

value of i : 1 	caliculating i ** 3:  1
value of i : 2 	caliculating i ** 3:  8
value of i : 3 	caliculating i ** 3:  27
value of i : 4 	caliculating i ** 3:  64
value of i : 5 	caliculating i ** 3:  125
value of i : 6 	caliculating i ** 3:  216
value of i : 7 	caliculating i ** 3:  343
value of i : 8 	caliculating i ** 3:  512
value of i : 9 	caliculating i ** 3:  729
value of i : 10 	caliculating i ** 3:  1000
This is out of for block

Python shellにrange関数の結果を表示させてみよう。

>>> range(1,11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(-3,7)
[-3, -2, -1, 0, 1, 2, 3, 4, 5, 6]

range関数 range(m, n) は $m < n$ であれば負の数であってもよく、$m$ から始まる$n - m$個の要素からリストを返すことがわかる。

演習: スクリプト for.py をカウンタ範囲を変更して実行してみなさい。

iterable要素をカウンタ値とする

Pythonでは、for文のカウンタ変数の取る値は記号 [ ] で挟まれたリスト要素とすることができる。 このことは、既にを付けたPython入門(3) 文字列操作/文字列の一部を切り出すで紹介しているfor文の使い方である。 再び、iterable要素をカウンタ値とするfor文で触れる。

Pythonの繰り返し for A in B: であらわれる B は繰り返し可能オブジェクト(iterable)である。 iterableなオブジェクトとは要素が並んでいるデータで、順番に次の要素が取り出されるというようになっている。 以下の例のように、文字列が並んでいるリストや、文字(letter)の並びである文字列(string)はiterableであり、for文で使うことができるということだ。

次のスクリプトを見てみよう

#!/usr/bin/env python
# -*- coding: utf-8 -*-

prev = ""
for animal in ["cat", "dog", "tiger", "lion", "puma", "horse"]:
    print "value of animal :", animal
    prev = prev + animal
    print prev
print "This is out of for block"
演習: 上のスクリプト for_list.py を実行し、カウンタ変数 animal と 変数 prev の値に注目して観察しなさい。

for文の入れ子(nest)

for文など多くの構文は入れ子にすることができる。 次のスクリプトは、Pythonからみると、1つのfor文(そのカウンタ変数が i である)である。 たdし、繰り返されるブロックは print "outside for"とfor文(そのカウンタ値 が k)の2つの文であることに注意する。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

for i in range(1, 5):
    print "outside k-for"
    for k in range(i):
        print "inside k-for: i = ", i, " k = ", k
演習: 上のスクリプト for_nest.py を実行し、カウンタ変数 i と k の値に注目して観察しなさい。

while文:条件が満たされいる限り繰り返す

キーワード while に続いて条件式の値が True である限り、ブロックを繰り返し実行するのがキーワード while文である。

while  条件式:
    文1
    ....
    文n

次の2つの点に注意して欲しい。

次のスクリプト while.py は、キーボードから文字 "y" または "Y" を入力しない限り、i が 1、2,3, ..と1つづ増えて、その3乗を計算し続ける。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

answer = ""
i = 1

while not(answer == "y" or answer == "Y"):
    print "variable i: ", i,
    print "\tI ** 3: " , i ** 3
    i = i + 1
    answer = raw_input("repeat more? (y/Y): ")

print "while loop has just terminated"
演習: 上のスクリプト while.py を実行しなさい。 while loopが続けられる条件は answer != "y" and answer != "Y" と書き換えても等価であることを説明しなさい。

重要: For文をwhile文に書き換える

数値カウンター k を使った次のfor文は常にwhile文に書き換えることができる。

for k in range[m, n]:
    文1
    ...
    文n
$\qquad\displaystyle\Downarrow$
k = m
while k < n:
    文1
    ...
    文n
    k = k + 1
演習: 先のスクリプト while.py をwhile文を使った等価なスクリプト for_while.py を書いて実行して確かめてみなさい。

while文の入れ子(nest)

while文は構文は入れ子にすることができる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

i = 1
k = 5
while (i > 0):
    print "ourside in-while"
    while (k < 5):
        print "inside in-while"
        print "inside while: i = ", i, " k = ", k
演習: 先のスクリプト while_nest.py をカウンタ変数 i と k の値に注目して観察しなさい。
演習: 先のスクリプト for_nest.py をwhile文で書き換えて実行しなさい。

while文の入れ子(nest)

while文は構文は入れ子にすることができる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

i = 1
k = 5
while (i > 0):
    print "ourside in-while"
    while (k < 5):
        print "inside in-while"
        print "inside while: i = ", i, " k = ", k
演習: 先のスクリプト while_nest.py をカウンタ変数 i と k の値に注目して観察しなさい。
演習: 先のスクリプト for_nest.py をwhile文で書き換えて実行しなさい。