[Python]05章-01 制御構文（比較演算子と条件分岐）

#[Python]05章-01 比較演算子と条件分岐
この章からは制御構文について学んでいきます。
今まで皆さんが書いてきたプログラムは、基本的には上から順に処理がなされ、順番に実行されていました。

しかし、私たちの生活でもそうですが、私たちは何か判断しながら普段生活しています。例えば、「天気が晴れだったら外出」し、「天気が雨だったら室内で過ごす」といったものです。

コンピュータプログラムでも同じように判断して実行する処理を選ぶことができます。ただし、その条件の指定には比較演算子という新たな演算子を学ぶ必要があります。
比較演算子はそこまで難しくはないですが、表記方法が数学と異なるのでそこをポイントとして押さえてください。

##比較演算子 ～条件の記述～
まずは条件分岐で重要な比較演算子について説明します。
例えば、以下の式は当たり前ですが等しいと言えます。

```math
5 = 2 + 3
```

これをPythonプログラムで等しいかどうかを調べるには以下のように記載します。
**Python Console**に以下のコードを入力してください。なお、**=（イコール）は2つ続けて書いてください。**

```.py
>>> 5 == 2 + 3
True
```
2と3を足すと5になるかどうかを判定しようとしています。当然**True（真）**となります。
なお、**「==」**と記載しましたが、これが比較演算子です。左辺と右辺を比較して判定しています。**「=」（イコール）**としてしまうと、代入となってしまいますので気を付けてください。
<font color=orange>（※）</font>Pythonでは「==」が比較演算子で等しいを表しますが、プログラム言語によっては異なりますのでご注意ください。

では、あえて異なる値を入れてみましょう。**Python Console**に以下のコードを入力してください。

```.py
>>> 5 == 1 + 3
False
```
1と3を足した結果が5であるかを判定しようとしています。当然**False（偽）**となります。

他にも比較演算子は以下の種類があります。

| 比較演算子 | 意味 | 例 |例の意味|
|:-:|:-:|:-:|:-:|
| ==  | 等しい  | x == 5  |xと5は等しいか?|
| !=  | 等しくない  | x != 5| xと5は等しくないか?|
|  > | より大きい  | x > 5  |xは5より大きいか?|
|  >= | 以上  |x >= 5   |xは5以上か?|
|  < | 未満（より小さい）  | x < 5  |xは5未満か?|
|  <= |以下   | x <= 5  |xは5以下か?|

以下、実行例です。実際に異なる値を代入して試してみましょう。

```.py
>>> 5 == 5
True
>>> 5 != 5
False
>>> 5 != 4
True
>>> 5 > 4
True
>>> 5 >= 5
True
>>> 5 > 5
False
```

なお、文字列やリストの比較も可能となります。

```.py
>>> 'book' == 'book'
True
>>> 'book' != 'book'
False
>>> L1 = [1, 2, 3]
>>> L2 = [1, 2, 3]
>>> L1 == L2
True
```

##条件分岐（if文）
ここでは、条件分岐について触れていきます。
条件分岐を書くには、**if文**を記載します。

文法的には以下のように記載します。

```.py
if 条件:
    条件を満たしたときに実行される処理
```
この「条件を満たしたとき」というのが、先ほどの比較演算子（つまり条件）による結果が**True**になったときという意味であります。

なお、条件式の後に**「:」**（コロン）を忘れないようにして下さい。これがないとエラーとなります。

また、「条件を満たしたときに実行される処理」のところの前には、「Tabキー」で**インデント（字下げ）**しています。これも忘れないようにしてください。これがないと、**if文**の中身とわからないためです。（詳細は次に記載）

文法的に書くと難しくなるので、実際にプログラムを書きながら説明します。今回記載するプログラムは以下の通りです。
<font color="blue">整数値をキーボードから入力して、それがもし正であったら「正の値が入力されました」と記載するプログラムを作成する。</font>

まず、条件を**フローチャート（流れ図）**で表してみたいと思います。フローチャートを描くと、どなたでもプログラムの内容を把握しやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/e42052f8-e58d-18e8-0cf2-00d11d6025ff.png)


これをもとに、プログラムを作成していきましょう。
これからプログラムを作成するのですが、今回は久しぶりに、プログラムをエディタに入力するために、フォルダと.pyファイルを作成します。
今回のファイルは<font color="#0cc">chap05</font>フォルダを作成し、その中に<font color="#0cc">05-01-01.py</font>というファイルを作成します。なお、作成方法を忘れてしまった場合には、[「01章-03」](https://qiita.com/ko0821/items/59a48e307c153c615aa4)で確認してみてください。

```05-01-01.py
#整数値の入力。このままだと文字列となるので、int関数で数値に変換
n = int(input('整数の値を入力してください：'))

#正の値の場合、つまりnが0より大きい場合にprint関数で出力
if n > 0:
    print('正の整数値が入力されました')
```
プログラムを書いたら実行してみましょう。

><font color="#090" bgcolor="black">【実行結果】</font>
整数の値を入力してください：<font color="00cccc">5</font>
正の整数値が入力されました

ifの、**n > 0**の個所で、**「5 > 0かどうか」**を判定しています。もちろん**True**なので、if文内が実行されます。


##インデントについて
先ほど、if文の中身は、インデント（字下げ）するようにと述べました。このことについて少し掘り下げて触れてみます。以下のコードを追記してください。

```05-01-01.py
#整数値の入力。このままだと文字列となるので、int関数で数値に変換
n = int(input('整数の値を入力してください：'))

#正の値の場合、つまりnが0より大きい場合にprint関数で出力
if n > 0:
    print('正の整数値が入力されました')
    print(f'今、あなたは{n}を入力しました。')
```

もう1つコードを記載してみます。<font color="#0cc">chap05</font>フォルダ内に<font color="#0cc">05-01-02.py</font>というファイルを作成します。違いは、最後の出力の個所をインデントさせていないかだけです。

```05-01-02.py
#整数値の入力。このままだと文字列となるので、int関数で数値に変換
n = int(input('整数の値を入力してください：'))

#正の値の場合、つまりnが0より大きい場合にprint関数で出力
if n > 0:
    print('正の整数値が入力されました')
print(f'今、あなたは{n}を入力しました。')
```

それぞれ、実行してください。なお、**その際には負の値を入力**してください。

＜05-01-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数の値を入力してください：<font color="00cccc">-1</font>

＜05-01-02.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数の値を入力してください：<font color="00cccc">-1</font>
今、あなたは-1を入力しました。

違いが判りましたでしょうか？
まず、入力した数値は**n = -1**なので、**n > 0**のところでは、**-1 > 0**となり**False**となるので、if文内は処理されなくなります。ここまでは両方のプログラムで共通です。

<font color="#0cc">05-01-01.py</font>ではif文内の2行はインデントをしているので、**if文内の処理として扱われて**、今回は処理はされていません。
<font color="#0cc">05-01-02.py</font>では片方インデントをしていないため、if文が終了して、**if文の外の処理として**実行されていることになります。

文字で書くと難しいので、フローチャートで描くと違いが以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/470d6ae2-f829-d4fb-f2c0-042a60761e7f.png)


##条件分岐（if～else文）
今まで書いたプログラムは、正の値が入力されると「正の整数値が入力されました」と出力されました。では、負の値が入力された際はどうでしょう。
先ほど実際に-1と入力しましたが、「負の整数値が入力されました」とは出力されませんでした。

つまり、条件を満たさなかった場合の処理を何も書いていない状態です。そのような条件を書きたい場合には**else（エルス）**を用います。構文としては以下の通りです。

```.py
if 条件:
    条件を満たしたときに実行される処理
else:
    条件を満たさなかったときに実行される処理
```

実際には、以下のようにプログラムを書きます。<font color="#0cc">chap05</font>フォルダ内に<font color="#0cc">05-01-03.py</font>というファイルを作成し、以下のコードを入力してください。

```05-01-03.py
#整数値の入力。このままだと文字列となるので、int関数で数値に変換
n = int(input('整数の値を入力してください：'))

#正の値の場合、つまりnが0より大きい場合にprint関数で出力
if n > 0:
    print('正の整数値が入力されました')
else:  ##上記の条件に満たないときに以下のprint関数で出力
    print('負の整数値が入力されました')
print(f'今、あなたは{n}を入力しました。')
```

＜05-01-03.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数の値を入力してください：<font color="00cccc">-1</font>
負の整数値が入力されました
今、あなたは-1を入力しました。


解説していくと、今回入力値として**n = -1**を入力しました。
したがって、条件のところで、**-1 > 0**となるので**False**となり条件を満たしません。
したがって**else**側が実行され、「負の整数値が入力されました」と出力されます。


##条件分岐（if～elif～else文）
では、この状態で再度実行して、入力値として**0**を入力してみます。すると以下の結果になります。

＜05-01-03.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数の値を入力してください：<font color="00cccc">0</font>
負の整数値が入力されました
今、あなたは0を入力しました。

**0**は正の数でも負の数でもないのに「負の整数値が入力されました」と出力されてしまいます。**0**が入力された際には「0が入力されました」と出力されるように改良してみます。

しかしそうすると、3つの分岐となります。どのように表現するのでしょうか？これを解決するのに、**elif**という文を用います。構文で表現すると以下の通りです。

```.py
if 条件1:
    条件1を満たしたときに実行される処理
elif 条件2:
    条件1を満たさなく、条件2を満たしたときに実行される処理
else:
    条件2も満たさなかったときに実行される処理
```

実際にプログラムを書いてみましょう。<font color="#0cc">chap05</font>フォルダ内に<font color="#0cc">05-01-04.py</font>というファイルを作成し、以下のコードを入力してください。

```05-01-04.py
#整数値の入力。このままだと文字列となるので、int関数で数値に変換
n = int(input('整数の値を入力してください：'))

#正の値の場合、つまりnが0より大きい場合にprint関数で出力
if n > 0:
    print('正の整数値が入力されました')
elif n < 0:  ##nが0未満のにprint関数で出力
    print('負の整数値が入力されました')
else:  ##n>でもn<0でもないとき（つまり0のとき）
    print('0が入力されました')
print(f'今、あなたは{n}を入力しました。')
```
ここでフローチャートで表現してみましょう。以下の通りになっていると思います。プログラムとフローチャートを見比べて処理を追ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/a011927a-aff6-fc95-dfad-da308ab70866.png)



##演習問題
演習問題を用意しました。ぜひ解いてみてください。なお、ファイル名は[ ]内に指定したものを使用して、<font color="00cccc">chap05</font>内に作成ください。使用する変数名は好きな変数名を指定してかまいません。
<font color="3333ff">
[05-01-p1.py]
【1】入力された整数が偶数か奇数かを判定するプログラムを作成してください。
（ヒント：偶数は2で割るとあまりが0に、奇数は2で割るとあまりが1になります。）
＜05-01-p1.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数を入力してください：<font color="00cccc">1</font>
奇数です
</font>

<font color="3333ff">
[05-01-p2.py]
【2】正の整数値を読み込んで、それを3で割った値に応じて、「その値は3で割り切れます」「その値は3で割ると1余ります」「その値は3で割ると2余ります」のいずれかを表示するプログラムを作成してください。
＜05-01-p2.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
整数を入力してください：<font color="#0cc">256</font>
その値は3で割ると1余ります
</font>

##最後に
今日はプログラミングをする上で重要なif文について学びました。
今後学ぶプログラムについては当たり前のようにif文はよく出てきます。どのプログラムでも条件判定は必ずあるので、ぜひ覚えましょう。

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