Python if文まとめ

# 0 はじめに

こんにちは。橘諸兄です。
久し振りの記事の投稿です。
私のfor文のまとめの記事を多くの方にご閲覧・高評価頂いております。ありがとうございます。

この記事では`if`文についてPythonの初学者さんにも分かるように書きます。

# 1 if文の使い方

`if`文は分岐処理に用いるもので、殆ど全てのプログラミング言語に実装されているでしょう。
`if`文に分類されるものは`if`、`elif`や`else`があります。

## 1-1 if
```py
if (条件P):
  Pの時の行う動作
```

`if`はこれだけです。

例えば
```py
n=3
if n==3:
  print("Yes")
```
だと
```
Yes
```
と出力されます。


## 1-2 else
`else`は`if`に対して次のように用います。

```py
if (条件P):
  (Pの時の動作)
else:
  (Pでない時の動作)
```

例えば
```py
n = 2
if n == 3:
  print("Yes")
else:
  print("No")
```
だと
```py
No
```
と出力されます。

## 1-3 elif
`elif`は`else if`の略です。(`C++`には無いでしょう)
その名前の由来の通り、`elif`は`if`に対して次のように用います。

```py
if (条件P):
  (Pの時の動作)
elif (条件Q):
  (PでなくQの時の動作)
```

例えば、

```py
n = 2
if n == 3:
  print("Yes")
elif n == 2:
  print("Oh")
else:
  print("No")
```

であれば、一つ目の条件`n == 3`は通過し、二つ目の条件`n == 2`には引っ掛かるので、

```
Oh
```
が出力されます。

又、`if`の後に`elif`ではなく`if`を用いた場合、その前の`if`文とは切り離されて処理されます。注意しましょう。
つまり、
```py
n = 3
if n > 2:
  print("A")
if n > 1:
  print("B")
```
だと、2つの`if`が別々に扱われるので
```
A
B
```
となります。
(2つ目を`elif`とした場合、`B`は出力されませんね。確かめてみましょう。)

## 1-4 while
`while`文は`for`文の仲間ですが、条件をとるという点で`if`文と似ていると思いました。一応紹介しておきます。
`while`は
```py
while (条件P):
  (条件Pが成立っている間ずっとこの動作を行う)
```
のように用います。

例えば、
```py
n = 3
while n > 0:
  print(n)
  n = n - 1
```
であれば、nが0より大きい間`print(n)`と`n=n-1`が実行されるので、
```
3
2
1
```
と出力されます。

(以下、発展的な内容ですので、参考までに)

又、`for`文と同様に途中で強制終了することもできます。
```py
n = 3
while n > 0:
  print(n)
  n = n - 1
  break
```
であれば、`while`内の処理を1回行った時に強制的に終了されるので、出力は
```
3
```
だけです。

そして、`for`文と同様、`break`で終了されなかったかは`else`で検出することができます。
```py
n = 3
while n > 0:
  print(n)
  n = n - 1
else:
  print("Oh")
```
であれば、`break`による強制終了はされていないので
```
3
2
1
Oh
```
となります。

# 2 条件のルール
条件には主に、比較演算子や論理演算子が使われます。

## 2-1 比較演算子
上に書いた`n == 3`や`n > 0`などのように、2つの要素がどうかを調べるものを比較演算子と言います。
比較演算子には次のようなものがあります。

|比較演算子|意味|
|--|--|
|`a == b`|`a`と`b`が等しいか|
|`a != b`|`a`と`b`が異なるか|
|`a < b`|`b`は`a`より大きいか|
|`a > b`|`b`は`a`より小さいか|
|`a <= b`|`b`は`a`以上か|
|`a >= b`|`b`は`a`以下か|

・`=`ではなく`==`であることに注意して下さい。`=`は値の変更です。
・比較演算子は、真なら`True`、偽なら`False`を返します。`True`と`False`は`bool`という型に所属しています。
・型が異なる場合は、`==`で比較しても`False`が帰ってきたり、`>`などの大小比較をしてもエラーが出たりします。
・(`is`というのもあるようですが、`==`の方が確実です。気になる方は[参考になる記事](https://qiita.com/gyu-don/items/d94d7b29e411258fcb32#:~:text=Python%E3%81%A7%E3%81%AF%E3%80%81%E5%90%8C%E4%B8%80%E3%81%A7%E3%81%82%E3%82%8B,%E3%81%A7%E3%81%99%E3%80%82)をご覧ください。)


## 2-2 論理演算子
論理演算子は条件から新たな条件を作るものです。次のようなものがあります。
(`P,Q`は条件とします)

|論理演算子|意味|
|--|--|
|`not P`|`P`でない|
|`P and Q`|`P`も`Q`も成り立つ|
|`P or Q`|`P`か`Q`どちらかは成り立つ|

高校数学で扱うのと全く一緒ですね。

これらを複合させてもっと複雑な条件を作ることもできますが、異なる論理演算子を結合させる時は`()`で括って明確にするとよいでしょう。
例えば、`P かつ (Q かつ R)`なら`P and Q and R`でいいのですが、`P かつ (Q または R)`を表したい時は、`P and (Q or R)`としましょう。

~~(実験してみたところ、論理演算子は左から順に実行されるように見えました。
つまり、`P and Q or R`なら`(P and Q) or R`として実行されるようです。)~~
<span style="color: red;"> (2024/08/25 22:54 shiracamusさんのご指摘による訂正) 論理演算子は`and`が優先されます。 </span>

又、`P`か`Q`どちらかだけが成り立つとしたい場合、`bit`演算子`^`を使うとよいでしょう。
この場合は次のように条件を`()`で囲む必要があります。
```py
n = 1
if (n == 1) ^ (n == 2):
  print("Oh")
```
出力は勿論
```
Oh
```
です。

# 3 発展的な話
## 3-1 条件以外にも使えます

`if`の後には「条件」以外も来れます。
例えば、

```py
if True:
  print("Oh")
if False:
  print("Wow")
```
とすれば、Trueのところは実行されてFalseのところは実行されず、
```
Oh
```
と出力されます。

(上に述べたような演算子も`bool`値を返すものでしたから、`if`文は`bool`値を引数(?)にとるものと考えられますね。)

前のコードは至って冗長でしたが、`while`文ではこのような記法はよく使われます。
```py
while True:
  print("Wow")
```
とすると、
```
Wow
Wow
Wow
(以下限りなく続く)
```
とずっと続きます。

## 3-2 bool値以外でも使えます
実は、`if`文の後に来れるのは`int`型、`str`型、`list`型などいくらでもあります。
```py
n = 10
s = "ABC"
t = ""
L = [1,2,4]
if n:
  print("a")
if s:
  print("b")
if t:
  print("c")
if L:
  print("d")
```
を実行すると
```py
a
b
d
```
と出力されました。

恐らく、`if`の後に来たものは`bool`型に変換されてから処理されているのでしょう。
実際、
```py
n = 10
s = "ABC"
t = ""
L = [1,2,4]
print(bool(n))
print(bool(s))
print(bool(t))
print(bool(L))
```
とすると、
```
True
True
False
True
```
と出力されました。

~~「空」のもの(`int`なら`0`、`str`なら空文字列、`list`なら空配列など)が`False`になり、そうでないものが`True`になるのだと思います。~~

<span style="color: red;"> (2024/08/25 22:54 shiracamusさんのご指摘による追加情報)  </span>
`False`になる組み込みオブジェクトは、偽であると定義されている定数(`None`と`False`)、数値型におけるゼロ、空のシーケンスまたはコレクション(`''`,`()`,`{}`など)です。

# 4 さいごに
最後までお読みいただきありがとうございました。
`if`文関連で記事を書こうと思い立って90分で仕上げましたが、意外と長くなってしまいました。
([Python版APG4b](https://atcoder.jp/contests/APG4bPython/tasks/APG4bPython_g)がAtCoderさんから出ているようで、この記事の需要は果たしてあるのかという話ですが)
ついでに、随分前ですが[for文についての記事](https://qiita.com/MoroeTachibana-oh/items/b3afbd952db3aee10ef7)も執筆致しましたので、そちらも併せてご覧頂けると幸いです。
ではまた別の記事でお会いしましょう。さようなら。

追記.shiracamus様のご指摘により、誤情報を改め曖昧な箇所を正確に修正しました。shiracamus様に感謝を申し上げます。