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