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つの点に注意して欲しい。
- コロン(:)で改行する
 - Trueの時に実行される 文1,...,文n はそれぞれ1行ずつ書いて、キーワード if に比べて字下げ(indent)して記述する(ブロック文)。
 
次のスクリプト 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$個の要素からリストを返すことがわかる。
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文の入れ子(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
while文:条件が満たされいる限り繰り返す
キーワード while に続いて条件式の値が True である限り、ブロックを繰り返し実行するのがキーワード while文である。
while  条件式:
    文1
    ....
    文n
次の2つの点に注意して欲しい。
- キーワード while の行末にコロン(:)で改行する
 - 条件式が True の間繰り返されるブロック文は、キーワード while に比べて字下げ(indent)して記述する(ブロック文)。
 
次のスクリプト 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"
重要: 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文の入れ子(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