0 はじめに
こんにちは。橘諸兄です。
久し振りの記事の投稿です。
私のfor文のまとめの記事を多くの方にご閲覧・高評価頂いております。ありがとうございます。
この記事ではif
文についてPythonの初学者さんにも分かるように書きます。
1 if文の使い方
if
文は分岐処理に用いるもので、殆ど全てのプログラミング言語に実装されているでしょう。
if
文に分類されるものはif
、elif
やelse
があります。
1-1 if
if (条件P):
Pの時の行う動作
if
はこれだけです。
例えば
n=3
if n==3:
print("Yes")
だと
Yes
と出力されます。
1-2 else
else
はif
に対して次のように用います。
if (条件P):
(Pの時の動作)
else:
(Pでない時の動作)
例えば
n = 2
if n == 3:
print("Yes")
else:
print("No")
だと
No
と出力されます。
1-3 elif
elif
はelse if
の略です。(C++
には無いでしょう)
その名前の由来の通り、elif
はif
に対して次のように用います。
if (条件P):
(Pの時の動作)
elif (条件Q):
(PでなくQの時の動作)
例えば、
n = 2
if n == 3:
print("Yes")
elif n == 2:
print("Oh")
else:
print("No")
であれば、一つ目の条件n == 3
は通過し、二つ目の条件n == 2
には引っ掛かるので、
Oh
が出力されます。
又、if
の後にelif
ではなくif
を用いた場合、その前のif
文とは切り離されて処理されます。注意しましょう。
つまり、
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
は
while (条件P):
(条件Pが成立っている間ずっとこの動作を行う)
のように用います。
例えば、
n = 3
while n > 0:
print(n)
n = n - 1
であれば、nが0より大きい間print(n)
とn=n-1
が実行されるので、
3
2
1
と出力されます。
(以下、発展的な内容ですので、参考までに)
又、for
文と同様に途中で強制終了することもできます。
n = 3
while n > 0:
print(n)
n = n - 1
break
であれば、while
内の処理を1回行った時に強制的に終了されるので、出力は
3
だけです。
そして、for
文と同様、break
で終了されなかったかはelse
で検出することができます。
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
というのもあるようですが、==
の方が確実です。気になる方は参考になる記事をご覧ください。)
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
として実行されるようです。)
(2024/08/25 22:54 shiracamusさんのご指摘による訂正) 論理演算子はand
が優先されます。
又、P
かQ
どちらかだけが成り立つとしたい場合、bit
演算子^
を使うとよいでしょう。
この場合は次のように条件を()
で囲む必要があります。
n = 1
if (n == 1) ^ (n == 2):
print("Oh")
出力は勿論
Oh
です。
3 発展的な話
3-1 条件以外にも使えます
if
の後には「条件」以外も来れます。
例えば、
if True:
print("Oh")
if False:
print("Wow")
とすれば、Trueのところは実行されてFalseのところは実行されず、
Oh
と出力されます。
(上に述べたような演算子もbool
値を返すものでしたから、if
文はbool
値を引数(?)にとるものと考えられますね。)
前のコードは至って冗長でしたが、while
文ではこのような記法はよく使われます。
while True:
print("Wow")
とすると、
Wow
Wow
Wow
(以下限りなく続く)
とずっと続きます。
3-2 bool値以外でも使えます
実は、if
文の後に来れるのはint
型、str
型、list
型などいくらでもあります。
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")
を実行すると
a
b
d
と出力されました。
恐らく、if
の後に来たものはbool
型に変換されてから処理されているのでしょう。
実際、
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
になるのだと思います。
(2024/08/25 22:54 shiracamusさんのご指摘による追加情報)
False
になる組み込みオブジェクトは、偽であると定義されている定数(None
とFalse
)、数値型におけるゼロ、空のシーケンスまたはコレクション(''
,()
,{}
など)です。
4 さいごに
最後までお読みいただきありがとうございました。
if
文関連で記事を書こうと思い立って90分で仕上げましたが、意外と長くなってしまいました。
(Python版APG4bがAtCoderさんから出ているようで、この記事の需要は果たしてあるのかという話ですが)
ついでに、随分前ですがfor文についての記事も執筆致しましたので、そちらも併せてご覧頂けると幸いです。
ではまた別の記事でお会いしましょう。さようなら。
追記.shiracamus様のご指摘により、誤情報を改め曖昧な箇所を正確に修正しました。shiracamus様に感謝を申し上げます。