Python基礎講座(9 反復)

# 反復処理
前回までに「順次・分岐・反復」のうち「順次・分岐」を説明しました。
今回は「反復」を説明します。「反復」は『複数回同じ処理を行う』と
表現できますが、同じ処理に異なる値を使用することも可能なため、
厳密には同じ処理ではありません。

## forループ
### range
任意の回数繰り返したい場合は**for i in range()**を使用します。

```py3:for_explain1.py
for i in range(5):
   print("{0}".format(i))
```

変数iをプログラムでは「ループカウンタ｣と呼びます。
このプログラムではループカウンタを出力していますが、実行結果は以下になります。
**0
1
2
3
4**

range(X)と書くことで、ループカウンタの値は0からX-1を格納し、X回繰り返し処理を行います。
ループカウンタの値をプログラムの処理で用いることが出来ます。

range(X,Y)と記述することで、ループカウンタの開始の値を設定することができます。
ループカウンタの値はXからY-1を格納し、Y-X回繰り返し処理を行います。

```py3:for_explain2.py
for i in range(1,10):
   print("{0}".format(i))
```

**1
2
3
4
5
6
7
8
9**
出力結果は上記のようになります。

### enumurate
リストの要素を1つずつ取得しながら、要素それぞれに処理を行いたい場合が多いです。
この場合はenumurateを使用します。

```py3:for_explain3.py
a = ["a","b","c","d","e"]
for idx,elem in enumerate(a):
   print("{0} = {1}".format(idx,elem))
```

**0 = a
1 = b
2 = c
3 = d
4 = e**
出力結果は上記のようになります。
forの後ろに2つの変数を設定可能です。
最初の変数がループカウンタ(上記のプログラムではidx)になり、
後の変数がリストのループカウンタに対応した要素(上記のプログラムではelem)になります。

```py3:for_explain4.py
a = ["a","b","c","d","e"]
for idx in enumerate(a):
   print("{0}".format(idx))
```
**(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')**
forの後ろに変数を1つのみ設定した場合、変数にはループカウンタと対応した要素が格納されます。

## whileループ
forループが「決められた任意の回数繰返す」のに対して、whileループは
「特定の条件を満たす間繰り返す」場合に使用します。

```py3:while_explain.py
a = ["ok","ok","ok","ng","ok"]
i = 0
while a[i] == 'ok':
    print("a[{0}] is ok".format(i))
    i = i + 1
```

出力結果は以下のようになります。
**a[0] is ok
a[1] is ok
a[2] is ok**
繰り返し処理の最初にa[i]が"ok"かを判定し、Falseの場合繰り返し処理を終了するため、
a[3]以降は処理の対象となりません。

whileループを使用する際は、[無限ループ](http://e-words.jp/w/E784A1E99990E383ABE383BCE38397.html)にならないよう、ループカウンタの変更を忘れず記述してください。
ただしこの時ループカウンタのインデントに注意してください。下のプログラムは誤ったプログラムです。

```py3:while_explain_IL.py
a = ["ok","ok","ok","ng","ok"]
i = 0
while a[i] == 'ok':
    print("a[{0}] is ok".format(i))
i = i + 1
```
字下げが不正の場合(i = i + 1がwhileループ内に設定されていない)
whileループ内ではiは0から変わらないため、無限ループが発生します。
*※もし無限ループが発生してしまった場合は(使用している開発環境にもよりますが)
Ctrlキーを押しながら「C」を押すか、右上の×を押してプログラムを強制終了してください。*

## breakとcontinue
「繰り返し処理を終了する」処理がbreak、「今回の繰り返しを終了し、次の繰り返し処理を始める」処理がcontinueです。
forループ、whileループのどちらでも使用できます。

```py3:break_continue_explain.py
i = 0
while i < 10:
    i = i + 1
    if i < 3:
        continue
    print("i is {0}".format(i))
    if i == 5:
        break

print("final i is {0}".format(i))
```
出力結果は以下となります。
**i is 3
i is 4
i is 5
final i is 5**
プログラム内でcontinueとbreakは以下のような意味を持ちます。

**if i < 3:
　　continue**

は、「iが3より小さい場合、以降の処理を行わなずに次の繰り返し処理を行う」
という意味のため、iの値が0、1、2の場合は画面に値が出力されません。

**if i == 5:
　　break**
は、「iが5の場合、繰り返し処理を終了する」という意味のため、最後に出力されるiは5です。

## ループ内のelse
ifでも使用したelseをループ文の最後に記述すると、「ループが終了した時の処理」として使用できます。
forループ、whileループのどちらでも使用できます。

```py3:loop_else.py
for i in range(3):
    print("{0}".format(i))
else:
    print("for loop done")

while i < 5:
    i = i + 1
    print("{0}".format(i))
else:
    print("while loop done")
```

実行結果は以下のようになります。
**0
1
2
for loop done
3
4
5
while loop done**

しかし、以下のプログラムでも同じ実行結果が返されます。

```py3:loop_else2.py
for i in range(3):
    print("{0}".format(i))

print("for loop done")

while i < 5:
    i = i + 1
    print("{0}".format(i))

print("while loop done")
```

実際にPythonを日常的に使用しているプログラマでも、ループ内のelseを使用しない人もいます。

次: [Python基礎講座(10 内包表記)](http://qiita.com/Usek/items/5eb3235ba10becb6df96)