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様に感謝を申し上げます。