if文

【Python】if文での条件分岐の基本的な使い方

【Python】if文での条件分岐の基本的な使い方

Pythonにおけるif文での条件分岐の基本的な使い方について解説します。

if文による条件分岐処理

Pythonでは、ある条件に一致した場合に処理を分岐させる際にifを使用します。

本記事では、Pythonにおけるif文による条件分岐の基本的な使い方とifを用いた三項演算子の使い方についても紹介していきます。

if文の基本的な使い方

Pythonによるif文の構文は以下になります。

if文
if 条件式A:
    条件式Aが真の場合の処理
elif 条件式B:
    条件式Bが真の場合の処理
else:
    すべての条件式が偽の場合の処理

if文は条件式に一致する場合(真:True)の場合にブロック内の処理に入ります。複数条件がある場合には、elifで条件式を記載します。elifは複数条件がある場合は複数記載することができます。記載したすべての条件式に一致しない(偽:False)の場合には、elseのブロックで記載した処理を実行します。

以降で例を使ってif文の条件分岐を見ていきましょう。

ブール値を使ったif文の条件分岐

if文では、条件式がTrueFalseかによって条件を分岐します。条件式がTrueの場合は、if文の次の行の処理へ進みますが、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のとき
不正解

FLAGTrueを設定した場合、「正解」という文字が表示され、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文は比較演算子が評価して返却した結果がTrueFalseかを判定して処理を分岐しているわけです。

上記の==演算子の他にも、Pythonでは以下のような比較演算子を使った条件分岐が可能です。

比較内容演算子
等しい==
等しくない!=
より小さい<
以下<=
より大きい>
以上>=
含まれるin
オブジェクトが同一is

比較演算子での条件分岐について説明しました。if文がTrueFalseかを判定して条件分岐をしているという特徴を考えれば、もちろん比較演算子に限らず、開発者が作った判定関数の返却値をifに指定することで条件分岐させることも可能です。

Note

==演算子と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)で条件式を指定する

分岐する際にの条件式が複数である場合や、条件を否定したもので分岐させるには以下のように論理演算子(andornot)を使用することができます。

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

上記例では「正の数 かつ(and) 偶数」「正の数 または(or) 偶数」「正の数ではない(not)」を判定する簡単な判定関数を定義して、-2~2までの数値の判定結果を表示しています。

各関数の中でif文を定義していますが、見ていただければわかるように論理積(かつ)の場合はandを、論理和(または)の場合はorで条件をつなげます。条件を否定をする場合はnotで否定することが可能です。

Note

短絡評価(Short-circuit Evaluation)

and演算子やor演算子は、評価が不要な場合に残りの部分の評価を省略する場合があります。例えば、「A and B」という式があり、AFalseと評価されるとBを評価することなく式はFalseになります。また、「A or B」という式の場合、ATrueと評価されると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文を扱うときに一つ覚えておくべき重要な項目はTrueFalseの判定の考え方についてです。if文はTrueFalseを判定しているわけですが、if文の判定は必ずしもブール値である必要はありません

Pythonでは、以下の表に示すような値についてはFalseとして扱います。言い換えれば、以下に該当しないものについてはTrueと判定されるわけです。

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)の基本 ~ try, except, raise ~」でまとめているので参考にしてください。

例えば以下のような例を考えることができます。

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文で分岐した条件に従って返却文字列を返却するように分岐します。もちろん上記は1例なので、様々な条件のバリエーションを考えることが可能です。

三項演算子で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 = 1num = 2の例では、条件によって偶数"even"か奇数"odd"といった文字列をresultへ設定します。また、num = 3num = 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に限らずプログラミング言語では非常に重要な条件分岐構文です。ぜひ、しっかりと使い方を覚えて使いこなせるようになってください。