Pythonにおけるif
文での条件分岐の基本的な使い方について解説します。
if
文による条件分岐処理
Pythonでは、ある条件に一致した際に処理を分岐させるためにif
文を使用します。
この記事では、Pythonにおけるif
文による条件分岐の基本的な使い方とif
を用いた三項演算子の使い方について紹介していきます。
if
文の基本的な使い方
Pythonによるif
文の構文は以下になります。
if 条件式A: 条件式Aが真の場合の処理 elif 条件式B: 条件式Bが真の場合の処理 else: すべての条件式が偽の場合の処理
if
文は条件式に一致する場合(真:True
)の場合にブロック内の処理に入ります。複数条件がある場合には、elif
で条件式を記載します。elif
は複数条件がある場合は複数記載することができます。記載したすべての条件式に一致しない(偽:False
)の場合には、else
のブロックで記載した処理を実行します。
以降で例を使ってif
文の条件分岐を見ていきましょう。
ブール値を使ったif
文の条件分岐
if
文では、条件がTrue
ならば指定された処理を実行し、False
ならelse
の処理が実行されます。
以下は、FLAG
に設定した値の内容をチェックして処理を分岐する例になります。
print("FLAGがTrueのとき") FLAG = True if FLAG: print("正解") else: print("不正解") print("FLAGがFalseのとき") FLAG = False if FLAG: print("正解") else: print("不正解")
【実行結果】 FLAGがTrueのとき 正解 FLAGがFalseのとき 不正解
FLAG
にTrue
を設定した場合、「正解」という文字が表示され、False
の時は、「不正解」と表示されます。
比較演算子を用いたif
文の条件判定
if
文の条件式の部分には、もちろん比較演算子を用いた式を指定することができます。
以下は、文字列が等しいかどうかを==
演算子を用いた比較式で条件指定し、処理を分岐している例です。
# 比較演算子を使った条件分岐 data1 = "japan" print(f"data1: {data1}, data1 == 'japan'の評価結果: {data1 == 'japan'}") if data1 == "japan": print("Japanese") else: print("Unknown") data2 = "USA" print(f"data2: {data2}, data2 == 'japan'の評価結果: {data2 == 'japan'}") if data2 == "japan": print("Japanese") else: print("Unknown")
【実行結果】 data1: japan, data1 == 'japan'の評価結果: True Japanese data2: USA, data2 == 'japan'の評価結果: False Unknown
上記例では、文字列が"japan"
と等しいかどうかを判定し、等しければ"Japanese"
と出力し、等しくなければ"Unknown"
と表示するようにしています。
参考に==
演算子の結果をprint
していますが、==
演算子は等しければTrue
を、等しくなければFalse
を返しています。つまり、if
文は比較演算子が評価して返却した結果がTrue
かFalse
かを判定して処理を分岐しているわけです。
上記の==
演算子の他にも、Pythonでは以下のような比較演算子を使った条件分岐が可能です。
比較内容 | 演算子 |
---|---|
等しい | == |
等しくない | != |
より小さい | < |
以下 | <= |
より大きい | > |
以上 | >= |
含まれる | in |
オブジェクトが同一 | is |
比較演算子での条件分岐について説明しました。if
文がTrue
かFalse
かを判定して条件分岐をしているという特徴を考えれば、もちろん比較演算子に限らず、開発者が作った判定関数の返却値をif
に指定することで条件分岐させることも可能です。
【==
演算子とis
演算子】
is
演算子はオブジェクトの同一性を比較するために使用します。この演算子はNone
との比較など、特定の状況下で非常に重要で「if var is None:
」のように使用します。値を比較する==
演算子とは異なり、オブジェクトの同一性をチェックする点で重要な違いがあるので覚えておきましょう。
elif
を用いた複数の条件判定
if
文で複数の条件を指定したい場合については、以下のようにelif
を用います。
data1 = "japan" if data1 == "japan": print("Japanese") elif data1 == "USA": print("American") else: print("Unknown") data2 = "USA" if data2 == "japan": print("Japanese") elif data2 == "USA": print("American") else: print("Unknown") data3 = "China" if data3 == "japan": print("Japanese") elif data3 == "USA": print("American") else: print("Unknown")
【実行結果】 Japanese American Unknown
上記例では、文字列が"japan"
と等しければ"Japanese"
を、"USA"
であれば"American"
を、その他の場合は"Unknown"
と表示するようにしています。
上記の例では、1つのelif
しか使用していませんが、もちろん条件が複数ある場合には、elif
を続けて記載すれば複数条件分岐を実装することができます。
論理演算子(and
、or
、not
)で条件式を指定する
分岐する際にの条件式が複数である場合や、条件を否定したもので分岐させるには以下のように論理演算子(and
、or
、not
)を使用することができます。
def is_positive_and_even(number): """正の数 かつ 偶数""" if number > 0 and number % 2 == 0: return True else: return False def is_positive_or_even(number): """正の数 または 偶数""" if number > 0 or number % 2 == 0: return True else: return False def is_not_positive(number): """正の数ではない""" if not number > 0: return True else: return False print("===== 正の数 かつ(and) 偶数") for i in range(-2, 3): print(f"{i:2}: {is_positive_and_even(i)}") print("===== 正の数 または(or) 偶数") for i in range(-2, 3): print(f"{i:2}: {is_positive_or_even(i)}") print("===== 正の数ではない(not)") for i in range(-2, 3): print(f"{i:2}: {is_not_positive(i)}")
【実行結果】 ===== 正の数 かつ(and) 偶数 -2: False -1: False 0: False 1: False 2: True ===== 正の数 または(or) 偶数 -2: True -1: False 0: True 1: True 2: True ===== 正の数ではない(not) -2: True -1: True 0: True 1: False 2: False
上記例では「正の数 かつ 偶数」「正の数 または 偶数」「正の数ではない」を判定する簡単な判定関数を定義して、-2~2までの数値の判定結果を表示しています。各関数の中のif
文では、論理積はand
、論理和はor
、条件を否定するにはnot
を使用します。
短絡評価(Short-circuit Evaluation)
and
演算子やor
演算子は、評価が不要な場合に残りの部分の評価を省略する場合があります。例えば、「A and B
」という式があり、A
がFalse
と評価されるとB
を評価することなく式はFalse
になります。また、「A or B
」という式の場合、A
がTrue
と評価されるとB
は評価することなくTrue
となります。
このような評価を短絡評価(Short-circuit Evaluation)と言います。短絡評価は、例えば、特定の条件が満たされた場合にのみ重い判定処理を呼び出すようにする場合などに便利です。
# 関数a()がFalseを返す場合、関数b()は評価されない result = a() and b() # 関数a()がTrueを返す場合、関数b()は評価されない result = a() or b()
複数演算子を連結した条件式の記載
Pythonでは、例えば「0 <= x and x < 3
」のような条件を「0 <= x < 3
」のように連結して記載することができます。以下のようにif
文の条件式に複数演算子を連結した条件式を記載しても問題ありません。
numbers = range(-3, 4) print(list(numbers), "\n") print("===== 複数演算子を連結した条件式") for i in numbers: if 0 <= i < 3: print(f"{i:2}: {True}") else: print(f"{i:2}: {False}") print("===== andで条件を書く場合") for i in numbers: if i >= 0 and i < 3: print(f"{i:2}: {True}") else: print(f"{i:2}: {False}")
【実行結果】 [-3, -2, -1, 0, 1, 2, 3] ===== 複数演算子を連結した条件式 -3: False -2: False -1: False 0: True 1: True 2: True 3: False ===== andで条件を書く場合 -3: False -2: False -1: False 0: True 1: True 2: True 3: False
上記のように複数演算子を連結した条件式で記載することができます。参考にand
条件で書く例も記載しています。複数演算子を連結することで条件がシンプルになり、コードの可読性が向上します。
True
、False
判定の考え方
if
文のTrue
、False
の考え方には覚えておくべきことがあります。if
文の条件はブール値に限りません。Pythonでは、特定の値(0
、空文字
、None
等)はFalse
と判定されます。
以下はPythonでFalse
判定となるものの一覧です。
False判定となるもの | 具体的な値 |
---|---|
ブール値の偽 | False |
null値 | None |
整数のゼロ | 0 |
小数のゼロ | 0.0 |
空文字 | '' または "" |
空のリスト | [] |
空のタプル | () |
空の辞書 | {} |
空の集合 | set() |
例えば、以下の例は空のリストかどうかで判定するようなプログラムです。
# 空リストの判定 data_l = [] if data_l: print("リストには値が入っています。") else: print("リストは空です。") data_l = [10, 20, 30] if data_l: print("リストには値が入っています。") else: print("リストは空です。")
【実行結果】 リストは空です。 リストには値が入っています。
このように、ブール型に限らずにif
文の判定を実行することができるということは覚えておきましょう。
- Pythonの
if
文の条件は必ずしもブール値である必要はない null
値であるNone
、数値の0
,0.0
、空文字、空のリスト、空のタプル、空の辞書、空の集合もFalse
として判定される。
例外処理との組み合わせ
if
文は例外処理(try...except...
)と組み合わせることがよく行われます。Pythonにおける例外処理については「例外処理(exception)の基本」を参考にしてください。
例えば以下のような例を考えることができます。
def validate_age(data): try: age = int(data) except ValueError: # 入力が整数に変換できない場合 return "入力は数字である必要があります。" else: if age < 0: # 年齢が負の数の場合 return "年齢は正の数である必要があります。" elif age < 18: # 未成年の処理 return "あなたは未成年です。" else: # 成人の処理 return "あなたは成人です。" print(validate_age(10)) print(validate_age(20)) print(validate_age(-10)) print(validate_age("にじゅう"))
【実行結果】 あなたは未成年です。 あなたは成人です。 年齢は正の数である必要があります。 入力は数字である必要があります。
上記例のvalidate_age
関数では、入力データをint
に変換しようとして例外が発生した場合には「入力は数字である必要があります。」という文字列を返却します。
それ以外の場合は、if
文で分岐した条件に従って返却文字列を返却するように分岐します。
三項演算子でif
文を1行で記載する
上記でif
文の基本的な使い方を紹介してきました。Pythonには、if...else...
を使用して条件分岐を用いた式を1行で記載する三項演算子と言われる記載方法があります。
三項演算子の基本的な使い方
三項演算子の構文は以下になります。
条件式が真のときの評価式 if 条件式 else 条件式が偽のときの評価式
「条件式が真のときの評価式」「条件式」「条件式が偽の時の評価式」の三つの項目から構成されるため「三項」演算子と呼ばれています。以降で条件式(三項演算子)の使い方の例をいくつか見ていきましょう。
条件によって変数に代入する値を切り替える
条件によって変数に代入する値を切り替えるには以下のように三項演算子を使用します。
# 三項演算子で条件により設定する値を切り替える num = 1 result = "even" if num % 2 == 0 else "odd" print(result) num = 2 result = "even" if num % 2 == 0 else "odd" print(result) # 三項演算子で条件により式を切り替える num = 3 result = num * 2 if num % 2 == 0 else num * 3 print(result) num = 4 result = num * 2 if num % 2 == 0 else num * 3 print(result)
【実行結果】 odd even 9 8
num = 1
とnum = 2
の例では、条件によって偶数"even"
か奇数"odd"
といった文字列をresult
へ設定します。また、num = 3
とnum = 4
の例では、偶数であれば2
倍、奇数であれば3
倍するような式の結果をresult
へ設定します。
このように変数に設定する値を条件によって分岐させる場合にif...else...
を使った三項演算子の使用が便利です。
リスト内包表記と三項演算子の組み合わせ
三項演算子は、リスト内包表記と組み合わせて使用すると条件に応じてリストを作成する際の値を分岐させることが簡単にできます。なお、リスト内包表記については「リスト(list)内包表記の使い方」を参考にしてください。
以下の例を見てみましょう。
# リスト内包表記と三項演算子の組み合わせ result = ["even" if i % 2 == 0 else "odd" for i in range(10)] print(result)
【実行結果】 ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
上記例では、偶数か奇数かで"even"
を使うか"odd"
を使うかを分岐させながらリストを作成しています。
ラムダ(lambda
)関数と三項演算子の組み合わせ
三項演算子は、ラムダ(lambda
)関数と組み合わせて使用すると条件に応じて返却値が変わるラムダ関数を簡単に表現できます。なお、ラムダ関数については「ラムダ(lambda)関数:無名関数の使い方」を参考にしてください。
以下の例を見てみましょう。
# 三項演算子とラムダ関数の組み合わせ get_even_or_odd = lambda x: "even" if x % 2 == 0 else "odd" num = 1 print(get_even_or_odd(num)) num = 2 print(get_even_or_odd(num))
【実行結果】 odd even
上記例では偶数の場合は"even"
、奇数の場合は"odd"
を返却する関数をラムダ関数で定義して、返却値計算で三項演算子を使用しています。
この例ではラムダ関数を変数に代入して使用していますが、pep8やpylint等の構文チェックを使用すると警告が出ると思います。もともとラムダ関数は名前を付けずに使うためのものなので名前を付けるのであればdef
で関数宣言しなさいということになのですが、今回はラムダ関数の構文で三項演算子が使えることの紹介で分かりやすくするためにということで理解してください。
三項演算子使用の注意事項
三項演算子は、条件分岐を1行で記述できるため非常に便利なツールです。しかし、すべての状況で使用するのが適切とは限りませんので注意が必要です。
例えば、複雑な条件分岐や多段の分岐を無理に三項演算子で表現すると、コードの可読性が低くなってしまう可能性があります。極端な例ですが、以下のようなコードはどういった結果になるか想像するのが難しくなります。
# 不適切な使用例(避けるべき) result = "A" if score > 90 else "B" if score > 80 else "C" if score > 70 else "D" if score > 60 else "F"
三項演算子を使用する場合は、簡潔な条件分岐にとどめるようにしましょう。コードの明確さと保守性を考慮して採用を検討することが重要です。
まとめ
Pythonにおけるif
文での条件分岐の基本的な使い方について解説しました。
if
文による条件分岐の基本的な使い方を例を使いながら紹介しました。また、if...else...
を用いた三項演算子の使い方についても説明しています。
if
文はPythonに限らずプログラミング言語では非常に重要な条件分岐構文です。ぜひ、しっかりと使い方を覚えて使いこなせるようになってください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。