Pythonプログラミングにおいて、プログラムの流れを制御する「制御構造」は最も重要な概念の一つです。
その中でも「if文」による条件分岐は、特定の条件が満たされたときだけ特定の処理を実行させるための、プログラムの「判断基準」を作る役割を担います。
ユーザーからの入力内容に応じて動作を変えたり、データの値によって処理を振り分けたりと、if文を使わないプログラムは存在しないと言っても過言ではありません。
本記事では、Pythonにおけるif文の基本的な書き方から、より複雑な条件設定、そしてPythonらしいスマートな記述方法まで、現場で役立つ知識を詳しく解説していきます。
これからプログラミングを始める方はもちろん、基礎を再確認したい方もぜひ参考にしてください。
Pythonにおけるif文の役割と基本構造
Pythonのif文は、記述のシンプルさが特徴です。
他のプログラミング言語で見られる { } (波括弧) を使わず、インデント (字下げ) によって処理の塊 (ブロック) を表現するという独特のルールがあります。
if文の基本構文
最もシンプルなif文は、以下のように記述します。
score = 85
# scoreが80以上の場合にメッセージを表示する
if score >= 80:
print("合格です!おめでとうございます。")
合格です!おめでとうございます。
このコードでは、score >= 80 という条件が「真 (True)」であるため、その下の print 関数が実行されます。
もし条件が「偽 (False)」であれば、何も表示されません。
インデントが重要な理由
Pythonにおいて、インデントは単なる見た目の整頓ではなく、「プログラムの構造」を定義するものです。
if文の後に続く処理は、必ず同じ深さのインデント(一般的には半角スペース4つ)で記述しなければなりません。
temperature = 30
if temperature > 25:
print("今日は暑いですね。")
print("水分補給を忘れずに。") # これもif文の中の処理
print("プログラムを終了します。") # これはif文の外の処理
インデントを間違えると、意図しないタイミングで処理が実行されたり、IndentationError というエラーが発生したりします。
Pythonのif文を扱う際は、コロン (:) の後の行は必ずインデントを下げるというルールを徹底しましょう。
比較演算子と論理演算子を使いこなす
条件分岐を自由自在に操るためには、「比較演算子」と「論理演算子」の理解が欠かせません。
これらを組み合わせることで、「AかつB」「AまたはB」といった複雑な判定が可能になります。
比較演算子の種類
比較演算子は、2つの値を比較してその結果を真偽値 (True/False) で返します。
| 演算子 | 意味 | 使用例 |
|---|---|---|
== | 左辺と右辺が等しい | a == b |
!= | 左辺と右辺が等しくない | a != b |
> | 左辺が右辺より大きい | a > b |
< | 左辺が右辺より小さい | a < b |
>= | 左辺が右辺以上 | a >= b |
<= | 左辺が右辺以下 | a <= b |
特に注意が必要なのは、等しいことを表す演算子が == である点です。
数学のように = を使うと、Pythonでは「変数への代入」とみなされてエラーの原因となります。
複数の条件を組み合わせる論理演算子
「20歳以上、かつ男性」や「土曜日、または日曜日」といった条件を作るには、論理演算子を使用します。
- and (かつ):すべての条件がTrueの場合にTrueとなる
- or (または):いずれかの条件がTrueの場合にTrueとなる
- not (〜ではない):条件の結果を反転させる
age = 22
has_ticket = True
# 20歳以上、かつチケットを持っている場合
if age >= 20 and has_ticket:
print("入場可能です。")
# 数値の範囲を指定する便利な書き方 (Python特有)
score = 75
if 70 <= score < 80:
print("評価はBです。")
Pythonでは 70 <= score < 80 のように、数学的な不等式をそのまま記述できるのが大きな魅力です。
これにより、コードの可読性が飛躍的に向上します。
elifとelseによる多分岐処理
「もしAなら、そうでなければBなら、それ以外ならC」といった複雑な条件分岐には、elif (else ifの略) と else を使用します。
elifとelseの構文
point = 65
if point >= 80:
print("大変優秀です。")
elif point >= 60:
print("合格圏内です。")
elif point >= 40:
print("もう少し頑張りましょう。")
else:
print("再試験が必要です。")
合格圏内です。
この処理の流れは、上から順番に評価されます。
最初に条件が一致したブロックだけが実行され、それ以降の条件は無視されるという点が重要です。
例えば point = 85 の場合、最初の point >= 80 に該当するため、point >= 60 の条件は評価されません。
elseの役割
else は、これまでの全ての条件に当てはまらなかった場合の「受け皿」となります。
予期しない入力があった際のエラーハンドリングや、デフォルトの処理を記述する際によく使われます。
else には条件式を書く必要はなく、単に else: と記述するだけで機能します。
Pythonらしい高度な条件分岐
基本的なif文に慣れてきたら、よりPythonらしい効率的な書き方を取り入れてみましょう。
コードが短くなるだけでなく、意図が伝わりやすい洗練されたプログラムになります。
三項演算子 (条件付き式)
if文による結果を変数に代入する際、数行にわたるコードを1行にまとめることができます。
これを「三項演算子」または「条件付き式」と呼びます。
status = "大人" if age >= 20 else "子供"
これは、以下の通常のif文と同じ意味を持ちます。
if age >= 20:
status = "大人"
else:
status = "子供"
三項演算子は非常に便利ですが、条件が複雑になりすぎると逆に見づらくなるため、シンプルな代入時のみ使用するのがベストプラクティスです。
in演算子による存在確認
リストや文字列の中に特定の要素が含まれているかを判定する場合、in 演算子が威力を発揮します。
fruits = ["apple", "banana", "cherry"]
search_target = "apple"
if search_target in fruits:
print(f"{search_target}は見つかりました!")
これを使わない場合、ループを回して一つずつ比較する処理を書かなければなりませんが、in を使えば直感的かつ高速に処理を記述できます。
is演算子とNoneの判定
Pythonでは「値が存在しないこと」を示す None という特別な値があります。
None かどうかを判定する際は、== ではなく is 演算子を使うのが慣習です。
user_data = None
if user_data is None:
print("データが空です。")
is は「オブジェクトの同一性」を判定するもので、Noneの判定には必ず is None を使うと覚えておきましょう。
真偽値 (TruthyとFalsy) の理解
Pythonのif文では、条件式に True や False 以外の値を直接渡すことができます。
Pythonは特定の値を「偽 (False)」とみなし、それ以外を「真 (True)」とみなす性質を持っています。
Falsy (偽とみなされる) な値
以下の値は、if文の条件式に入れると False として扱われます。
- 数値の
0,0.0 - 空の文字列
"" - 空のリスト
[], 空の辞書{} NoneFalse
これを利用すると、リストが空でないことを確認する処理を非常に短く書けます。
items = []
# itemsが空でないならTrue
if items:
print("アイテムがあります。")
else:
print("アイテムは空です。")
アイテムは空です。
if len(items) > 0: と書くよりも、if items: と書くほうがPythonic (Pythonらしい) とされています。
複雑な条件分岐を整理するテクニック
プログラムが大規模になると、if文のネスト (入れ子) が深くなり、コードの可読性が著しく低下することがあります。
これを防ぐためのテクニックをいくつか紹介します。
ネストの回避とガード節
「もし〜なら」を重ねるのではなく、条件に合わないものを先に return や continue で弾いてしまう手法を「ガード節」と呼びます。
ネストが深い例:
def process_data(data):
if data is not None:
if "value" in data:
if data["value"] > 0:
# 本来やりたい処理
print("有効なデータです")
ガード節を使った改善例:
def process_data(data):
if data is None:
return
if "value" not in data:
return
if data["value"] <= 0:
return
# 本来やりたい処理
print("有効なデータです")
後者のほうが、メインの処理がどこにあるのかが一目で分かり、条件の追加や変更も容易になります。
match-case文との使い分け
Python 3.10から導入された match-case 文 (パターンマッチング) は、if文の多分岐をより洗練された形で記述できます。
command = "start"
match command:
case "start":
print("開始します")
case "stop":
print("停止します")
case _:
print("不明なコマンドです")
単純な値の比較であれば elif を並べるよりも match-case の方が視認性が高まります。
特に複雑な構造を持つデータ(タプルや辞書)の中身を判定する場合には、if文よりも強力な武器となります。
まとめ
Pythonのif文は、単なる条件分岐の構文を超え、Pythonらしいシンプルで読みやすいコードを書くための土台となります。
本記事で解説したポイントを振り返りましょう。
- インデントがブロックを定義するため、スペースの数は厳守する。
- 比較演算子 (==, !=, >, <) と 論理演算子 (and, or, not) を適切に組み合わせる。
- elif や else を活用して、無駄のない多分岐処理を構築する。
- in演算子やTruthy/Falsyの概念を使い、簡潔なPythonicなコードを目指す。
- ネストが深くなる場合は、ガード節を用いて可読性を高める。
if文をマスターすることは、プログラムの論理的な思考を磨くことに直結します。
基本を大切にしつつ、実際の開発では「誰が読んでも意図が伝わる条件分岐」を意識してコードを書いてみてください。
Pythonの柔軟な機能を使いこなせるようになれば、より複雑なアプリケーション開発への道が開けるはずです。
