Q1次のうち、if not value: のブロックが実行されるのはどれですか?
if / elif / else と条件分岐の応用
Python の if / elif / else による条件分岐を解説します。多分岐から三項演算子、isinstance / is None まで一通り図解で押さえます。
if と if not の基本
if 条件: は、条件が True のときだけブロックを実行する基本構文です。条件を否定したいときは if not 条件: のように not を頭に付けます。
not は True と 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("カートが空です")
# 出力: カートが空です
elif と else で多分岐を書く
複数の分岐を扱うには、elif と else を用います。
elif は else if の短縮形で、if の条件が False のときに次の条件を試し、どれも当てはまらなければ最後の else が実行されます。
条件は上から順に評価される。最初に True になった条件だけが実行され、残りはスキップされる。どれも True にならなければ else が実行されます。
# 信号の色で指示を返す
signal = "YELLOW"
if signal == "GREEN":
print("進んでよい")
elif signal == "YELLOW":
print("注意して通過")
elif signal == "RED":
print("停止")
else:
print("未知の信号")
# 出力: 注意して通過
elif は上から順に評価される
if age >= 0: ... elif age >= 20: ... のように広い条件を先に書くと、後の条件が一度も成立しません。多分岐では、狭い(厳しい)条件から順に並べることが多いです。
値そのものを条件に使う(真偽評価)
if の条件には == などの比較式だけでなく、値そのものを置けます。Python はその値を裏で bool に変換して判定し、「空」や「0」は False、それ以外は True として扱います。
| 型 | False 扱いになる値 | True 扱いになる値(例) |
|---|---|---|
| int / float | 0, 0.0 | 1, -1, 3.14 |
| str | ""(空文字列) | "a", "0"(中身があればどんな文字でも True) |
| list / tuple / set | [], (), set()(空のコレクション) | [1], (0,), {0} |
| dict | {}(空の辞書) | {"key": "value"} |
| None | None | (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 点の商品で進みます
三項演算子で 1 行 if を書く
「条件によって 2 つの値のどちらかを代入したい」だけなら、if / else で 4 行書かなくても 1 行で表現できます。これを三項演算子(条件式)と呼びます。書き方は 値1 if 条件 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 を使った方が読みやすくなります。
範囲チェックはそのままつなげられる
「0 以上 100 以下」のような範囲チェックは、and を使わずに比較演算子を連結して書けます。数学の不等式と同じ見た目になるので、意図がとても読み取りやすくなります。
score = 78
# and を使った書き方
if score >= 0 and score <= 100:
print("有効なスコア")
# 連結した書き方(同じ意味)
if 0 <= score <= 100:
print("有効なスコア")
型と値の正体を調べる(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 になる
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: で明示的に判定しましょう。
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("メールアドレス未登録")
この記事では、条件分岐の応用として if / if not の基本、elif / else による多分岐、空や 0 を False とみなす真偽評価、値1 if 条件 else 値2 の三項演算子、isinstance と is None による型・値チェック、in / not in によるコレクション判定を学びました。
次の記事では、リストの全要素がまとめて条件を満たすかを一発で調べる all() / any() を使いこなしていきます。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2次のコードの実行結果はどれですか?age = 18
status = "大人" if age >= 20 else "子供"
print(status)
Q3次のうち、None かどうかを判定する書き方として最も推奨されるのはどれですか?