for文とwhile文について

#前提
あるお仕事でPythonをプログラミング未経験者に説明することになったので、その下書きを兼ねてここにツラツラとPythonの簡単な説明を書いていきます。ここでは繰り返しについて扱います。


# while文

while文は

```python
while {条件式}:
    繰り返す処理
```

というように書きます。条件式が常に`True`だと無限ループが発生してしまうので注意しましょう。


## 例 : 連続する数のリストを作る

```python:ex1.py
n = 0
list = []
while n < 10: # "n<10"の時条件を満たす
    list.append(n) # リストの末尾にnを加える
    n += 1 # nに1を加える
print(list)
```

`ex1.py`を実行すると

```terminal
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
というリストが出力されます。


# for文
for文は

```python
for 要素 in シーケンス:
    繰り返す処理
```

というように書きます。シーケンスとは文字列やタプル、リストなどのことを指します。他にも繰り返すことが可能な要素を用いてfor文を書くことができます。

```python:ex_for.py
prefectures = ['東京','埼玉','神奈川','千葉','栃木','群馬','茨城']
for p in prefectures:
    print(p)
```

上の`ex_for.py`を実行すると関東の都道府県が`prefectures`から一つずつ出力されます。

```console:ex_for.pyの出力
東京
埼玉
神奈川
千葉
栃木
群馬
茨城
```

## range関数

for文ではrange関数がよく使われるのでrange関数についても説明します。
ひとまず、range関数は以下のようにして使います。

```
range(整数)
```

例えば `range(5)`とすると内部で`[0,1,2,3,4]`というリストが作られています。(※イメージです)
したがって以下のように書いてあげると、0から9までの整数が順番に出力されます。

```python
for i in range(10):
    print(i)
```


range関数がとる引数は一つとは限らないです。以下のように引数を入力することで数を飛ばし飛ばし出力したり、大きい数から小さい数へと数えることができます。

### 引数が2つの時

```python:ex2.py
for i in range(5,10):
    print(i)
```

引数が2個の時は1つ目の引数が数え始め、2つ目の引数が数え終わりを示します。
したがって`ex2.py`を実行すると5から9までの整数が出力されます。

```python:ex2.pyの出力
5
6
7
8
9
```
### 引数が3つの時

```python:ex3.py
for i in range(20,-10,-5):
    print(i)
```

引数が3個の時は3つ目の引数が飛ばして数える数を表します。これは負の整数でも構わないので`ex3.py`を実行すると20から順に-5ずつ-10の手前まで数を数えていきます。

```python:ex3.pyの出力
20
15
10
5
0
-5
```

## 例 : 3の倍数と3のつく数の時はバカになる

```python:ex4.py
list = []
for i in range(40):
    if not i % 3:
        list.append("(°▽°)")
    elif '3' in str(i):
        list.append("(°▽°)")
    else:
        list.append(i)
print(list)
```

`ex4.py`を実行すると以下のような出力が得られます。最初が`(°▽°)`になっているのは0が３で割り切れるからです。


```python:ex4.pyの出力
['(°▽°)', 1, 2, '(°▽°)', 4, 5, '(°▽°)', 7, 8, '(°▽°)', 10, 11, '(°▽°)', '(°▽°)', 14, '(°▽°)', 16, 17, '(°▽°)', 19, 20, '(°▽°)', 22, '(°▽°)', '(°
▽°)', 25, 26, '(°▽°)', 28, 29, '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)', '(°▽°)']
```

# breakとcontinue
ここではループ(繰り返し)の制御に必要となる`break`と`continue`について説明します。

* `break` : ループを終了する
* `continue` : ループ内のそれ以降の処理を実行しないでループの先頭に戻る

それでは具体例を見ていきましょう。

## breakの使い方

```python:ex_break.py
n = 1
while True:
    if n < 5:
        print(n)
        n += 1
    else:
        break
```

ここではwhile文が使われていますね。
while文の書き方は先ほどもあったように

```python
while {条件式}:
    繰り返す処理
```
となっていますので`while True:`は常に条件式が成立することを表します。これでは永遠に繰り返しが続いてしまい、コンピューターが壊れてしまいます。そこで`break`の出番となるわけです。
`ex_break.py`では、nが5未満のときnを出力し、それ以外のときは`break`、つまり繰り返しを終了する、とプログラムされています。したがって`ex_break.py`の出力は以下のようになります。

```python:ex_break.pyの出力
0
1
2
3
4
```

## continueの使い方

```python:ex_continue.py
for i in range(10):
    if i % 2 == 0:
        continue
    print(i)
```

ここではrange関数を用いてiに0から9の整数を代入しています。`print(i)`となっているので整数iが出力されるはずですが、`i % 2 == 0`、つまりiが2で割り切れるときは`continue`となっています。
`continue`ときはそれ以降の処理が実行されずに次のループに移るので`ex_continue.py`の出力は次のようになります。

```python:ex_continue.pyの出力
1
3
5
7
9
```

## 例 : コンピューターとジャンケン勝負をしよう
このように`break`と`continue`を組み合わせるとコンピューターと繰り返しジャンケンするプログラムが作れます。

```python:janken.py
from random import randint

hands = {0 : "グー", 1 : "チョキ", 2 : "パー"}

print("コンピューターとじゃんけん！！")
while True:
    player = input("0:グー 1:チョキ 2:パー 3:辞める\n>> ")

    # 3を選択した場合はループを終了する
    if player == "3":
        break

    # 求められる形式以外の入力だった場合はループの先頭に戻る
    elif player not in ("0","1","2"):
        print("正しい入力をしてください\n")
        continue
    com = randint(0,2) # コンピューターの手を決める

    # じゃんけんの勝敗を求める
    player = int(player)
    n = player - com
    if n == 0:
        ans = "あいこ"
    elif n == -1 or n == 2:
        ans = "あなたの勝ち"
    else:
        ans = "あなたの負け"

    # 結果を出力
    print("あなたの手:",hands[player],"   コンピューターの手:",hands[com])
    print("結果:",ans,"\n")
```