[光-Hikari-のPython]05章-10 制御構文（繰り返し処理の中断と継続）

#[Python]05章-10 繰り返し処理の中断と継続
今までfor文やwhile文を用いて、繰り返し処理を書いてきました。実はこの処理を途中で強制的に中断したり、条件によっては処理を継続させたりといったことができます。
そのために、それぞれ**break処理**や**continue処理**というものがあります。

それらの処理について触れていきましょう。[05章-09](https://qiita.com/ko0821/items/73a23cc8568f9bc80cdb)にあるプログラムを改良しながら見ていきます。
まず、05章-09のプログラムを再度見てみます。もう一度問題を確認します。
<font color="3333ff">
「クラスの生徒のテスト点数の**合計点**と**平均点**を求めるプログラムを作成します。ただし、クラスの生徒の人数はクラスごとに代わるため、何人いるかはわかっていません。点数を順番に入力していき、マイナスの値が入力されたらそれまでの合計点と平均点を求めるプログラムを作成します。なお、点数は100点満点とします。」
</font>

```.py
i = 1  #iはクラスの人数
total = 0 #クラスの合計点をtotalに加算していく
score = 0 #生徒の点数

while score >= 0:
    total += score
    score = int(input(f'{i}人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：'))
    i += 1

i -= 1 #人数が1人多いため1人分減らします
print(f'合計点：{total}')
print(f'平均点：{total/i}')
```

＜05-09-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
1人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：90
2人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：75
3人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：83
4人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：-1
合計点：248
平均点：62.0

##break文
先ほどの上記のプログラムを見ると、最後のほうで、**「i -= 1 #人数が1人多いため1人分減らします」**というのがあります。
人によっては、この1を引いているのは気になります。（プログラムの可読性を下げる要因となる場合があります。）
この処理をなくす方法を考えていきたいと思います。

今、上記のプログラムでは、**while文の条件に基づいて、点数入力の処理を続けるか、終了するかを判定しています。**
これを、**while文**内で入力処理を行い、入力した値がもし負の数だったら**while文を強制的に抜ける**といった処理にすることもできます。その際に、**break**を使います。

以下のプログラムで見てみましょう。<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">samp05-10-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```samp05-10-01.py
i = 1  #iはクラスの人数
total = 0 #クラスの合計点をtotalに加算していく
score = 0 #生徒の点数

#whileの条件がTrueなので、このままでは無限ループとなってしまう
while True:
    total += score
    score = int(input(f'{i}人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：'))

    #もし、入力値scoreが負の数であればbreakでwhile文を抜ける
    if score < 0:
        print(f'{score}が入力されたため、while文から強制的に抜けます。')
        break

    i += 1

#i -= 1 #←ここの処理はなくせる
print(f'合計点：{total}')
print(f'平均点：{total/i}')
```

＜samp05-10-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
1人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：90
2人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：75
3人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：83
4人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：-1
-1が入力されたため、while文から強制的に抜けます。
合計点：248
平均点：62.0

まず、特徴的な箇所が2か所あります。
1つ目は、**while True:**の個所です。本来、この条件の個所には、**==**や**<=**といった比較演算子を使いますが、**True**を書くということはすでに比較演算子による結果を書いています。
したがって、このままでは常に**True**なので、無限ループとなるということです。どうにかして抜ける必要があります。その方法が次に説明する2つ目の特徴となります。

2つ目は**while文**内にある、さらに**if文**の中にある**break**です。if文の条件が**score < 0**となっているため、ここでscoreに「負の数が入力されたら」という条件を用いて、**break**を通しています。
この**break**により、**while文**から強制的に抜けることができるのです。

そして、最後に入力した点数の合計値や平均値を求めています。そして、一番最初に書いた、**「i -= 1」**という処理をなくすこともできるのです。

##continue文
先ほど書いたプログラムにはもう1つ欠点があります。上記の問題文にある**「なお、点数は100点満点とします。」**という個所に注目してみましょう。
今、入力の際には100点を超過しないように入力をしていました。しかし、この点数は人間が入力するので例えば点数で**90**と入力するところを0を誤って多く打ってしまって**900**と入力することはあり得る話です。

このプログラムが点数処理のプログラムであればまだ問題ないですが、これがお金を扱うシステムだったらどうでしょう。重大なインシデント<font color=orange>（※）</font>となります。

<font color=orange>（※）</font>**インシデント**とは、予期せぬシステムの**中断**や**品質の低下**を意味します。トラブルと似た意味です。よくITサービスマネジメントの分野で使われる用語です。

それを防ぐ方法として、**continue文**があります。
先ほどのプログラムをさらに改良していきたいと思いますが、別に作ってみます。<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">samp05-10-02.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。
なお、入力した点数の加算（**total += score**）は2つのif判定後に実施するように書き換えを行っています。

```samp05-10-02.py
i = 1  #iはクラスの人数
total = 0 #クラスの合計点をtotalに加算していく
score = 0 #生徒の点数

#whileの条件がTrueなので、このままでは無限ループとなってしまう
while True:
    score = int(input(f'{i}人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：'))

    #もし、入力値scoreが負の数であればbreakでwhile文を抜ける
    if score < 0:
        print(f'{score}が入力されたため、while文から強制的に抜けます。')
        break

    # もし、入力値scoreが100より大きい場合は人数iをカウントせずにwhile文の最初から処理を始める
    if score > 100:
        print('scoreに100より大きい値が入力されたため再度入力してください。')
        continue

    total += score  #今回は上記2つのif判定後に点数加算処理
    i += 1

#i -= 1 #←ここの処理はなくせる
print(f'合計点：{total}')
print(f'平均点：{total/i}')
```
＜samp05-10-02.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
1人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：90
2人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：75
3人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：833
scoreに100より大きい値が入力されたため再度入力してください。
3人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：83
4人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：-1
-1が入力されたため、while文から強制的に抜けます。
合計点：248
平均点：62.0

while文内の**if文**で**score > 100**の個所で、100点より大きい値が入力されたかどうかを判定しています。
そして100より大きい値が入力されると、**continue文**により、while文の最初からやり直しという形になります。

##最後に
今回は**break文**と**continue文**について触れました。
この2つについては人によっては可動性が下がるという人もいるため、メンテナンスしずらいというプログラマもいます。実際の開発現場では使用する際にはよく会議とかで話し合いながら開発を進めていく必要があるでしょう。

また先ほど触れましたが、プログラム実行時の入力でミスを起こすことがあります。実は先ほどの入力でもまだ直すべきところはあり、数値範囲だけでなく、もし文字列を入力してしまったら、エラーとなってしまいます。
そういったエラー時の処理も考えなければなりません。なお、こういうミスをしない仕組みを作ることを**フールプルーフ**と言ったりしますので覚えておくとよいでしょう。（情報処理技術者試験ではよく出題されます）

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