[光-Hikari-のPython]05章-08 制御構文（while文～もう1つの繰り返し構文～）

#[Python]05章-08 while文～もう1つの繰り返し構文～
まず、以下のプログラムを見てください（プログラムを作成する必要はありません）

```.py
for i in range(10):
    print(i, end=' ')

print('処理終了')
```

これは、for文を用いて、0～9までの値を出力しています。今までは**for文**で記載してましたが、今回は上記のプログラムを**while文**で表現することについて触れていきましょう。

##while文の書き方
おおむね、while文は以下のように書きます。

```.py
while 条件式:
    処理の内容
```

条件はif文でも書いた、**i < 10**や**i == 0**といったものです。実際に上記のfor文のプログラムをwhile文を用いて表現してみましょう。<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">05-08-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```05-08-01.py
i = 0  ##iの値を0で初期化する

while i < 10:  ##iが10未満の時に処理をする
    print(i, end=' ')
    i+=1  ##iに1を加算する

print('処理終了')
```

＜05-08-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
0 1 2 3 4 5 6 7 8 9 処理終了

少し、for文よりはプログラムが長くなったように見えます。処理を追ってみましょう。

まず、**while文**の場合、繰り返し処理を行う場合には**i = 0**で初期化を行います。つまり、最初の値をどうするかを決める処理が必要です。
**for文**でいうと、range(0, 10)の0の部分がstartとなるので、スタートの0を決めます。
また、while文の場合、**i=0**としておくことで、**繰り返しの回数を把握することもできます**。

次にwhile文の中身に入っていきます。

**<font color="#0cc">【1ループ目】</font>**
**while i < 10:**では、条件式が**True**の場合に処理を繰り返していきます。今、**i = 0**なので、条件式は**0 < 10**となり、**True**となるので、while文の処理が始まります。

そして**i**の値（**i = 0**）を出力し、次に**i += 1**としています。もし、この**i += 1**をしないと、**<font color="#0cc">【2ループ目】</font>**のときの条件判定で、また同じ**0 < 10**となり、無限ループとなって、while文から永久に出られなくなります
ですので、**i += 1**でiを1ずつ加算し忘れないようにしてください。
（この時点で、**i = 1**となっています。）

**<font color="#0cc">【2ループ目】</font>**
今、**i = 1**なので、条件式は**1 < 10**となり、**True**となるので、while文の処理が始まります。

そして**i**の値（**i = 1**）を出力し、**i += 1**としています。（この時点で**i = 2**となっています。）

　　<font color=#0cc>＜条件がi < 10 の間にwhile文を繰り返します。＞</font>

**<font color="#0cc">【10ループ目】</font>**
今、**i = 9**なので、条件式は**9 < 10**となり、**True**となるので、while文の処理が始まります。

そして**i**の値（**i = 9**）を出力し、**i += 1**としています。（この時点で**i = 10**となっています。）

**<font color="#0cc">【11ループ目】</font>**
今、**i = 10**なので、条件式は**10 < 10**となり、**False**となり、while文から抜けます。

そしてwhile文の外にある、**print('処理終了')**が出力されます。

これをフローチャートで表すと以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/7e447e57-5061-63df-df31-43708e861d8a.png)

##while文を用いて和の計算を行う
for文でも触れましたが、例えば、1以上100以下の整数で、偶数の和を求めるには以下のように求めました。（プログラムを作成する必要はありません）

```.py
sum = 0
for i in range(1, 101):
    if i % 2 == 0:
        sum += i

print(f'総和：{sum}')
```
＜実行結果＞
>総和：2550

特に説明する必要はないかと思いますが、if文の個所で偶数であるかを判定して、**i**が偶数であった場合に加算をしております。

これをfor文でなく、**while文**で表現しましょう。
<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">05-08-02.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```05-08-02.py
sum = 0
i = 1

while i <= 100:
    if i % 2 == 0:
        sum += i  ##ここで和の計算
    
    i += 1 ##iの値を1増やす
print(f'総和：{sum}')
```

まず、和を求めるのに、**sum**の値を初期化するのはfor文のときと同じです。sumを0にしないと、正しく計算されません。

そして、**i**に**1**を代入し、while文の条件判定を行います。**i**が100以下の間にwhile文の条件が**True**となり、処理が繰り返されるので、その間に加算をしていきます。

**<font color="#0cc">【1ループ目】</font>**
**i=1**なので、if文の条件は**False**となり、sumへの加算処理はされず、if文内の処理を飛ばします。
そして、忘れていけないのは**iに1を加算すること**です。これをしないと、前述した通り無限ループとなってしまいます。（この時点で**sum=0, i=2**）

**<font color="#0cc">【2ループ目】</font>**
**i=2**なので、if文の条件は**True**となり、if文内において、sumへの加算処理はされます。
そしてiに1を加算し、i=3となります。（この時点で**sum=2, i=3**）

**<font color="#0cc">【3ループ目】</font>**
**i=3**なので、if文の条件は**False**となり、sumへの加算処理はされず、if文内の処理を飛ばします。
そしてiに1を加算し、i=4となります。（この時点で**sum=2, i=4**）

　　<font color=#0cc>＜条件がi <=100 の間にwhile文を繰り返します。＞</font>

**<font color="#0cc">【100ループ目】</font>**
**i=100**なので、if文の条件は**True**となり、if文内において、sumへの加算処理はされます。
そしてiに1を加算し、i=101となります。（この時点で**sum=2550, i=101**）

**<font color="#0cc">【101ループ目】</font>**
そして、while文の条件が**101 <= 100**となり、**False**となるので、while文から抜けます。

そして最後にprint関数でsumの値を出力しています。


##演習問題
演習問題を用意しました。ぜひ解いてみてください。なお、ファイル名は[ ]内に指定したものを使用して、<font color="00cccc">chap05</font>内に作成ください。使用する変数名は好きな変数名を指定してかまいません。
<font color="3333ff">
[05-08-p1.py]
【1】while文を利用して1～100までの整数の奇数の合計を求めるプログラムを作成してください。結果は2500となります。
</font>

<font color="3333ff">
[05-08-p2.py]
【2】while文を利用してリスト**ls=[3, 5, 4, 10, 7, 8]**の要素の平均を求めるプログラムを作成してください。結果は6.166666666666667となります。
（ヒント：**ls[0]**では**3**、**ls[1]**では**5**…といったように要素が取り出せます。つまり、**ls[i]**として、要素を取り出せますね。また**len(ls)**でリストの長さも取得できるので、その長さの間で処理を繰り返せます。）
</font>

<font color="3333ff">
[05-08-p3.py]
【3】【2】のプログラムを**for文**を用いて作成してください。
</font>

##最後に
while文について触れましたが、for文に比べると多少プログラムが長くなってます。
ただしやっていることは同じなので、理解は進みやすかったかと思います。次回はwhile文でよく使われるテクニックについて簡単に説明していきたいと思います。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)