Pythonのif文は条件分岐を作るときに使います。for文やwhile文でも必ず使うものなので、ぜひここでしっかりとマスターしておきましょう。
1. if文とは
if文は、「ある条件が真(True)の場合は処理Aを行い、偽(False)の場合は処理Bを行う」という条件分岐のコードを書くときに使うプログラミング構文です。
基本的な書き方は次の通りです。
if 条件式:
条件式がTrueの時に実行する処理文
条件式がTrueの場合に、その下に書いた処理文を実行します。
例えば、次のコードをご覧ください。
if 10 == 10.00:
print('同じ数値です。')
整数の10と浮動小数点数の10.00は同じ数値なので、Trueと判定されて、その下の処理文が実行されています。もし異なる数値の場合は何も実行されません。
if 5 == 10:
print('同じ数値です。')
if文では、条件分岐をTrueの場合、Falseの場合というようにブール値で分けるようになっています。そのためif文を使いこなすには、どういう時にTrueと判定され、どういう時にFalseと判定されるかを把握しておくことが重要です。これについては、「1.2. 条件式の判定(True or False)について」で解説しますので、まずはif文の条件分岐のパターンを見ておきましょう。
1.1. if文の条件分岐のパターン
if文では、elseとelifを使って条件分岐の処理を増やすことができます。それぞれ見ていきましょう。
1.1.1. elseで条件がFalseの場合の処理を追加する
次のように、elseを追加すると条件式がFalseの場合の処理も指定することができます。
if 条件式:
条件式がTrueの場合の処理
else:
条件式がFalseの場合の処理
この条件分岐は下図のような流れになっています。
実例を見てみましょう。以下のコードでは、まず、random.randint()で40から100の間の数値をランダムに生成して変数scoreに代入しています。そして、if文で数値が70より上の場合に「合格」、そうでない場合に「不合格」と出力するようになっています。
import random
score = random.randint(40, 101)
if score > 70:
print(f'合格:{score}点')
else:
print(f'不合格:{score}点')
これは「Pythonのif文のelseの使い方」でもさらに解説していますので、ぜひご確認ください。
1.1.2. elifで条件分岐を増やす
elifとはelse ifの略文です。このelif文を追加すると条件分岐を増やすことができます。次のように書きます。
if 条件式1:
条件式1がTrueの時の処理
elif 条件式2:
条件式2がTrueの時の処理
elif 条件式3:
条件式3がTrueの時の処理
else:
全ての条件がFalseの時の処理
elifはいくつあっても構いません。全ての条件を満たさない場合の処理をelseの下に指定します。elseはあってもなくても構いません。このコードを書くと条件分岐は下図のようになります。
実例を見てみましょう。以下のコードは、90点以上でS判定、80点以上でA判定、70点以上でB判定、60点以上でC判定、それ以外でD判定を出力するものです。
import random
score = random.randint(40, 101)
if score >= 90:
print(f'S判定:{score}点')
elif score >= 80:
print(f'A判定:{score}点')
elif score >= 70:
print(f'B判定:{score}点')
elif score >= 60:
print(f'C判定:{score}点')
else:
print(f'D判定:{score}点')
このようにelifを使うと条件分岐を増やすことができます。
「Pythonで else if (elif) を使って複数の条件分岐を作る方法」でも詳しく解説しているのであわせてご確認ください。
1.1.3. if文のネスティング
次のようにif文の中にif文を書くこともできます。
if 条件式1:
if 条件式2: # ← 条件式1を満たす場合にここに移る。
条件式2を満たす時の処理文
else:
条件式2を満たさない時の処理文
elif 条件式3:
条件式3を満たす時の処理文
else:
どの条件も満たさない時の処理文
このコードの条件分岐の流れは下図のようになっています。ここではelifとelseも使っていますが必須ではありません。if文の中に別のif文を作ることができるということを抑えてください。
これを使って次のようなコードを書くことができます。
勝ち点6以上、得失点差2点以上で一位通過、勝ち点6以上、得失点差1点以下で二位通過、勝ち点差6以下、得失点差2点以上で敗者復活戦、それ以外は予選敗退と自動で分けるものです。
import random
points = random.randint(0, 10)
goals = random.randint(-5, 6)
if points >=6:
if goals >= 2:
print(f'予選一位通過(勝ち点{points}:得失点差{goals})')
else:
print(f'予選二位通過(勝ち点{points}:得失点差{goals})')
elif points <=6:
if goals >= 2:
print(f'敗者復活戦へ(勝ち点{points}:得失点差{goals})')
else:
print(f'予選敗退(勝ち点{points}:得失点差{goals})')
それぞれ組み合わせると、自由に条件分岐を作ることができます。
1.2. 条件式の判定(True or False)について
このようにif文は、条件式がTrueの場合とFalseの場合の処理を分けて書くことができます。このTrueやFalseは「ブール値」といいますが、if文を使いこなすには、どういう時にTrueが返されて、どういう時にFalseが返されるのかを知っておく必要があります。
そこで、ここでブール値の判定についてしっかりと理解しておきましょう。
1.2.1. 比較演算子のブール値判定
比較演算子で、オブジェクト同士を比較した場合はブール値が返ってきます。以下が比較演算子の一覧です。
演算子 | 例 | 説明 |
== | a == b | 2つの値が等しい時にTrue |
!= | a != b | 2つの値が等しくない時にTrue |
> | a > b | 左項の値が右項の値より大きい時にTrue |
< | a < b | 左項の値が右項の値より小さい時にTrue |
>= | a >= b | 左項の値が右項の値以上の時にTrue |
<= | a <= b | 左項の値が右項の値以下の時にTrue |
is | a is b | 両者が同一オブジェクトの時にTrue |
is not | a is not b | 両者が同一オブジェクトでない時にTrue |
in | a in b | bの中にaが含まれている時にTrue |
not in | a not in b | bの中にaが含まれていない時にTrue |
※詳しくは「Pythonの演算子一覧」で解説しています。
これらの比較演算子でオブジェクトを比較すると、次のコードのようにTrueやFalseを返しますね。
a = 10
b = 10
print(a == b)
print(a != b)
それでは、比較演算子を使ってifの条件式を書いてみましょう。
以下のコードは、「1 + 1 が 2 に等しい場合」に条件式がTrueを返して「print(‘正解’)」を実行します。条件式がFalseの場合は何も実行されません。
if 1 + 1 == 2:
print('正解')
次のコードも見てみましょう。
a = 1
b = 2
c = 3
if a == b:
print('aとbは等しいです。')
elif a == c:
print('aとcは等しいです。')
elif a > c:
print('aはcより大きいです。')
elif b > c:
print('bはcより大きいです。')
else:
print('全ての条件がFalseです。')
まず最初のif文の条件式はFalseなので、その処理文は実行されず、次のelifの条件式に移ります。そこでもFalseなので、次の条件式に移ります。最終的に全ての条件がFalseなので、elseの処理文が実行されます。
Python特有の記法として「1 < x < 10」のような書き方も可能です。
num = 5
if 1 < num < 10:
print(f'{num}は1より大きく10より小さい')
1.2.2. 比較演算子以外のブール値判定
最初は見慣れないかもしれませんが、if文の条件式には数値やリスト、タプル、辞書などのオブジェクトを指定することもできます。これらは以下のようにTrueと判定されます。なお、以下のコード内で使っているbool()関数は、オブジェクトのブール値を返す関数です。
num = 10
list = [1, 2, 3]
dict = {'A': 'apple', 'B':'banana'}
print(bool(num))
print(bool(list))
print(bool(dict))
このため、これらをそのままif文の条件式に書くと、条件分岐において全てTrueとみなされます。
if num:
print(num)
if list:
print(list)
1.2.3. Falseと判定されるケース
PythonでFalseとされるのは以下のものです。
- ブール値としてのFalse
- None(null)
- 数値の0(整数:0、浮動小数点数:0.0、複素数:0j)
- 空の文字列、リスト、タプル、辞書
実際に確認してみましょう。
print(bool()) # Noneの場合
print(bool(0)) # 数値の0(浮動小数点数含む)の場合
print(bool('')) # 空の文字列の場合
print(bool([])) # 空のコンテナ(リスト、タプル、辞書など)の場合
逆に言うと、これら以外のオブジェクトは全てTrueになると覚えておきましょう。これらを覚えておくと、次のようにオブジェクトが空の場合の条件分岐処理をシンプルに書くことができます。
list = []
if list:
print('リストは空ではありません。')
else:
print('リストは空です。')
2. 論理演算子を使った複数条件の指定
論理演算子を使うと、複数の条件分岐を一行で指定できるようになります。論理演算子には以下の3つがあります。これらは単体でも組み合わせても使うことができます。
論理演算子 | 例 | 説明 |
and | 条件1 and 条件2 | 条件1と条件2が両方ともTrueの場合にTrue |
or | 条件1 or 条件2 | 条件1と条件2のいずれか一方でもTrueの場合にTrue |
not | not 条件1 | 条件1がTrueの場合にFalse、Falseの場合にTrue |
シンプルでわかりやすいコードを書くには、これらを使いこなすべきです。具体的に解説していきますね。
2.1. andによる複数条件(論理積)の指定
条件式で論理演算子のandを使うと、次のようなネスティング構造のif文を簡潔に書くことができるようになります(外側の条件がFalseの場合と内側の条件がFalseの場合の処理が同一の場合に限る)。
まず、これをandを使わずに書くと次のようなコードになります。
import random
num = random.randint(0, 101)
if num % 3 == 0:
if num % 5 == 0:
print(f'{num}は3と5の倍数です。')
else:
print(f'{num}は3と5の倍数ではありません。')
else:
print(f'{num}は3と5の倍数ではありません。')
andを使うと、これと同じ条件をはるかにシンプルに書くことができます。
import random
num = random.randint(0, 101)
if num % 3 == 0 and num % 5 == 0:
print(f'{num}は3と5の倍数です。')
else:
print(f'{num}は3と5の倍数ではありません。')
これを使うと有名なFizzBuzzクイズのコードも、こんなにスッキリしたものになります。なおfor文については「Pythonのfor文による繰り返し処理(forループ)の基本」をご覧ください。
for num in range(1, 16):
if num % 3 == 0 and num % 5 == 0:
print(num, ' FizzBuzz')
elif num % 3 == 0:
print(num, ' Fizz')
elif num % 5 == 0:
print(num, ' Buzz')
else:
print(num)
「Pythonのif andで複数の条件を満たす処理を一行で書く方法」もご確認ください。
2.2. orによる複数条件(論理和)の指定
条件式でorを使うと、次のようなelifとelseの条件分岐を省略して書くことができます(ただし、「if条件式」と「elif条件式」がTrueの場合の処理が同一の時に限る)。
これをorを使わずに書くと次のようなコードになります。
import random
num = random.randint(0, 101)
if num % 3 == 0:
print(f'{num}は3か5の倍数です。')
elif num % 5 == 0:
print(f'{num}は3か5の倍数です。')
else:
print(f'{num}は3の倍数でも5の倍数でもありません。')
orを使うと、はるかに簡潔に書くことができます。
import random
num = random.randint(0, 101)
if num % 3 == 0 or num % 5 == 0:
print(f'{num}は3か5の倍数です。')
else:
print(f'{num}は3の倍数でも5の倍数でもありません。')
「Pythonのif or でいずれか1つでも条件を満たす場合の処理を一行で書く方法」もあわせてご確認ください。
2.3. notによる条件否定
条件式でnotを使うとTrueとFalseを反転させることができます。例えば、Pythonは以下の状況の時にFalseと判定されることは上述しました。
- ブール値としてのFalse
- None
- 数値の0(float型含む)
- 空の文字列、リスト、タプル、辞書など
notを使うと、こういう場合に特定の処理を行うという条件を作ることができます。
name = '' # 名前が空の状態
if not name:
print('名前が空白です。')
このように、プログラム上Falseと判定されるものに対して条件指定を行うにはnotを使う必要がありますので覚えておきましょう。
また、次のコードのように、「3の倍数でない場合」という否定形の条件を作るのも頻繁に使いますし、とても便利です。
for num in range(1, 16):
if not num % 3 == 0:
print(f'{num}は3の倍数ではありません。')
else:
print(num)
「Pythonのif notで条件を満たさない場合の処理を書く方法」ではさらに詳しく解説しています。
3. まとめ
if文について解説してきました。まずは、if文の条件分岐のパターンと、ブール値(True or False)の判定についてしっかりと理解しましょう。その後に、andやor、notを使った書き方も交えて、それぞれがどういう分岐になるのかを混乱しないように一つずつ習得していきましょう。
どのような条件分岐にしたいのかを最初に書き出してからコードを書くと良い練習になりますし、理解も深まるでしょう。
コメント