順番に読み進めながら学べます

if / elif / else と条件分岐の応用

Python の if / elif / else による条件分岐を解説します。多分岐から三項演算子、isinstance / is None まで一通り図解で押さえます。

if と if not の基本

if 条件: は、条件が True のときだけブロックを実行する基本構文です。条件を否定したいときは if not 条件: のように not を頭に付けます。

notTrue と False を反転させる演算子で、「〜でないとき」「〜が空でないとき」のような表現を素直に書けます。

# if:条件が True のときだけ実行
is_logged_in = True
if is_logged_in:
    print("ようこそ")
# 出力: ようこそ

# if not:条件を反転して評価
is_logged_in = False
if not is_logged_in:
    print("ログインしてください")
# 出力: ログインしてください

# 比較式と組み合わせる
cart = []
if not cart:
    print("カートが空です")
# 出力: カートが空です

ユーザーのメール認証状況をチェックします。

email_verified = False を定義してください。

if email_verified: で、認証済みなら「ご利用ありがとうございます」を表示してください。

if not email_verified: で、未認証なら「メール認証を完了してください」を表示してください。

(正しく実行できれば解説が表示されます)

Python エディタ

コードを実行してください

elif と else で多分岐を書く

複数の分岐を扱うには、elifelse を用います。

elifelse if の短縮形で、if の条件が False のときに次の条件を試し、どれも当てはまらなければ最後の else が実行されます。

if / elif / else の評価の流れ
開始if 条件1処理1elif 条件2処理2else処理3TrueFalseTrueFalseそれ以外

条件は上から順に評価される。最初に True になった条件だけが実行され、残りはスキップされる。どれも True にならなければ else が実行されます。

# 信号の色で指示を返す
signal = "YELLOW"

if signal == "GREEN":
    print("進んでよい")
elif signal == "YELLOW":
    print("注意して通過")
elif signal == "RED":
    print("停止")
else:
    print("未知の信号")
# 出力: 注意して通過

ユーザーの権限 role に応じて画面メッセージを切り替えます。

role = "member" と代入してください。

role == "admin" なら「管理画面にアクセスできます」、role == "member" なら「マイページにアクセスできます」、role == "guest" なら「ログインしてください」、それ以外なら「不明な権限です」を表示してください。

Python エディタ

コードを実行してください

elif は上から順に評価される

if age >= 0: ... elif age >= 20: ... のように広い条件を先に書くと、後の条件が一度も成立しません。多分岐では、狭い(厳しい)条件から順に並べることが多いです。

値そのものを条件に使う(真偽評価)

if の条件には == などの比較式だけでなく、値そのものを置けます。Python はその値を裏で bool に変換して判定し、「空」や「0」は False、それ以外は True として扱います。

値の真偽評価
0 / "" /[] / {} / Nonebool 変換False中身ありbool 変換True
False 扱いになる値True 扱いになる値(例)
int / float0, 0.01, -1, 3.14
str""(空文字列)"a", "0"(中身があればどんな文字でも True)
list / tuple / set[], (), set()(空のコレクション)[1], (0,), {0}
dict{}(空の辞書){"key": "value"}
NoneNone(None 以外の全ての値)

この性質を使うと、「入力が空かどうか」「カートに商品が入っているか」といったチェックを短く書けます。

if len(cart) > 0: で長さが 0 より大きいとせずに、if cart: だけで同じ意味になります。これは Python らしい書き方としてよく使われます。

# 検索キーワードが空なら検索を実行しない
search_query = ""
if search_query:
    print(f"検索中: {search_query}")
else:
    print("キーワードを入力してください")
# 出力: キーワードを入力してください

# カートに 1 つでも商品が入っていればチェックアウト画面へ
cart = ["apple", "bread"]
if cart:
    print(f"{len(cart)} 点の商品で進みます")
# 出力: 2 点の商品で進みます

配送先住所の登録状況をチェックします。

shipping_address = ""(空文字列)としてください。

if shipping_address: の書き方で、住所があれば「配送準備 OK」、無ければ「住所を登録してください」を表示してください。

shipping_address"東京都千代田区…" のような値を入れ直して、もう一度同じ if を実行し、結果が変わることを確かめてください。

Python エディタ

コードを実行してください

三項演算子で 1 行 if を書く

「条件によって 2 つの値のどちらかを代入したい」だけなら、if / else で 4 行書かなくても 1 行で表現できます。これを三項演算子(条件式)と呼びます。書き方は 値1 if 条件 else 値2 です。

三項演算子の読み方
値1if条件else値2
# 通常の if / else で書くと 4 行
age = 25
if age >= 20:
    status = "成人"
else:
    status = "未成年"

# 三項演算子なら 1 行
status = "成人" if age >= 20 else "未成年"
print(status)   # 成人

単純な 2 択のみに使うのがコツです。条件や値が長くなる・3 択以上になる場面では、素直に if / elif / else を使った方が読みやすくなります。

購入金額に応じて送料表示を切り替えます。

total_price = 3200 を定義してください。

② 三項演算子で、total_price >= 5000 なら「送料無料」、そうでなければ「送料 500 円」を shipping_label に入れてください。

print()shipping_label を表示してください。

Python エディタ

コードを実行してください

範囲チェックはそのままつなげられる

「0 以上 100 以下」のような範囲チェックは、and を使わずに比較演算子を連結して書けます。数学の不等式と同じ見た目になるので、意図がとても読み取りやすくなります。

score = 78

# and を使った書き方
if score >= 0 and score <= 100:
    print("有効なスコア")

# 連結した書き方(同じ意味)
if 0 <= score <= 100:
    print("有効なスコア")

テストの点数が有効範囲内(0〜100 点)かを判定します。

score = 78 を定義してください。

0 <= score <= 100 の連結比較で、範囲内なら「有効なスコア」、そうでなければ「範囲外」を表示してください。

score = 120 に入れ直して、もう一度同じ判定を実行してください。

Python エディタ

コードを実行してください

型と値の正体を調べる(isinstance と is None)

変数に入っている値の型をチェックしたいときは isinstance(値, 型) を使います。第 1 引数に調べたい値、第 2 引数に型名を渡すと、その型のインスタンスなら True が返ります。

price = 980
user_name = "tanaka"

print(isinstance(price, int))      # True
print(isinstance(user_name, str))  # True
print(isinstance(price, str))      # False

# if と組み合わせて、数値のときだけ計算する
if isinstance(price, int) and price > 0:
    tax_included = int(price * 1.1)
    print(tax_included)   # 1078

None とは何か

None「値が無いこと」を表す Python の特別な値です。「まだ取得できていない結果」「初期化前の状態」「関数が何も返さなかったとき」などを表すのに使われます。0 や空文字列とは区別される、唯一の "無" を表す値です。

None と他の値の違い
0(数値)""(空文字列)[](空リスト)None(値が無い)
# 関数が何も返さない場合、その戻り値は None になる
def greet():
    print("hello")

result = greet()      # "hello" が表示される
print(result)         # None

# 「まだ値が決まっていない」ことを表す初期値
selected_user = None
print(selected_user)  # None

値が None かどうかを判定するときは == ではなく is None を使うのが Python の書き方です。None はプログラム中にただ 1 つしか存在しない「値がないことを表す特別な値」で、同じメモリ上の 1 つのオブジェクトかどうかを is で照合した方が意図が明確になります。

# API から取得したユーザー情報(まだ取れていない状態を想定)
user = None

if user is None:
    print("ユーザー情報が未取得です")
else:
    print(f"ようこそ、{user} さん")
# 出力: ユーザー情報が未取得です

# 「None ではない」かどうかは `is not None`
score = 0
if score is not None:
    print(f"スコア: {score}")   # スコア: 0

0 と None は別物

if score: と書くと、score が 0 のときも False として扱われます。「未入力(None)」と「0 点」を区別したいときは、必ず if score is None: / if score is not None: で明示的に判定しましょう。

API から取得したユーザー情報の有無と型をチェックします。

user_age = None と定義してください。

user_age is None なら「年齢未登録」、そうでなく isinstance(user_age, int) が True なら user_age の値を表示してください。

user_age = 29 に入れ直して、同じ判定をもう一度実行してください。

Python エディタ

コードを実行してください

in / not in でコレクションの中身をチェック

「ある値がリストに含まれているか」を調べるには 値 in コレクション を使います。逆に「含まれていないか」は 値 not in コレクション です。対象はリスト・タプル・集合・文字列のほか、辞書の場合はキーに含まれているかを判定します。

allowed_roles = ["admin", "editor", "member"]
current_role = "member"

if current_role in allowed_roles:
    print("アクセス許可")
else:
    print("アクセス拒否")
# 出力: アクセス許可

# 文字列の中に特定の語が含まれるか
if "error" in "connection error: timeout":
    print("エラー行を検知")

# 辞書はキーをチェックする
user = {"name": "tanaka", "role": "admin"}
if "email" not in user:
    print("メールアドレス未登録")

ブログ記事の公開フラグをチェックします。

published_slugs = ["python-intro", "sql-basics", "git-tips"] を定義してください。

target = "git-tips" を定義してください。

targetpublished_slugs に含まれていれば「公開済み」、そうでなければ「下書き」を表示してください。

target"draft-post" に変えて、同じ判定をもう一度実行してください。

Python エディタ

コードを実行してください

この記事では、条件分岐の応用として if / if not の基本、elif / else による多分岐、空や 0 を False とみなす真偽評価値1 if 条件 else 値2三項演算子isinstanceis None による型・値チェック、in / not in によるコレクション判定を学びました。

次の記事では、リストの全要素がまとめて条件を満たすかを一発で調べる all() / any() を使いこなしていきます。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1次のうち、if not value: のブロックが実行されるのはどれですか?

Q2次のコードの実行結果はどれですか?
age = 18
status = "大人" if age >= 20 else "子供"
print(status)

Q3次のうち、None かどうかを判定する書き方として最も推奨されるのはどれですか?