プログラミングにおいて、プログラムの実行結果を状況に応じて変える「条件分岐」は、最も基本的なかつ重要な概念の一つです。
Pythonでは、「if文」を用いることで、特定の条件が満たされたときだけ処理を実行するといった制御が可能になります。
データの値によって処理を分けたり、ユーザーの入力に応じて挙動を変えたりと、if文がなければ複雑なアプリケーションを構築することはできません。
本記事では、Pythonのif文の基礎から、複数の条件を組み合わせる応用的な方法、さらにはコードを簡潔に記述できる「三項演算子」の活用術までを詳しく解説します。
Python 3.10以降で導入されたmatch文との使い分けや、可読性の高いコードを書くためのベストプラクティスも紹介しますので、ぜひ最後まで読み進めて、実戦で役立つスキルを身に付けてください。
if文の基本構造とインデントのルール
Pythonのif文は、他のプログラミング言語と比較しても非常にシンプルで読みやすい構文を持っています。
しかし、Python特有の「インデント(字下げ)」によるブロック構造を正しく理解していないと、意図しない挙動やエラーの原因となります。
基本的な書き方
if文の最もシンプルな形は、特定の条件が「真(True)」である場合にのみ処理を実行する形式です。
# 基本的なif文の例
score = 85
if score >= 80:
# 条件が成立した場合に実行される
print("合格です!素晴らしい成績ですね。")
print("処理が終了しました。")
合格です!素晴らしい成績ですね。
処理が終了しました。
このコードでは、変数 score の値が80以上であるかどうかを判定しています。
条件式の末尾には必ず : (コロン)を記述し、その次の行からは半角スペース4つのインデントを入れて処理を記述します。
インデントが持つ重要な役割
Pythonにおいて、インデントは単に見栄えを良くするためのものではなく、「どこまでがif文の範囲か」を定義するための構文規則です。
インデントがずれていると IndentationError が発生するか、あるいはプログラムが論理的に誤った動きをすることになります。
# インデントによる範囲の違い
status = "admin"
if status == "admin":
print("管理者としてログインしました。")
print("全メニューを表示します。") # ここまでがif文内
print("ログイン処理完了。") # インデントがないため、ifの結果に関わらず実行される
Pythonのコミュニティでは、「半角スペース4つ」によるインデントが標準(PEP 8)とされています。
タブ文字を混ぜると環境によって動作が変わるリスクがあるため、常にスペースを使用することを推奨します。
複数の条件を扱うelseとelif
単一の条件だけでなく、「条件に合致しなかった場合」や「別の条件を試したい場合」には、else や elif を活用します。
elseによる「それ以外」の処理
条件式が「偽(False)」だった場合に実行したい処理があるときは、else を使用します。
age = 18
if age >= 20:
print("お酒の購入が可能です。")
else:
print("未成年の方は購入できません。")
未成年の方は購入できません。
elifによる多方向への分岐
3つ以上の選択肢から適切な処理を選びたい場合は、elif (else ifの略)を間に挟みます。
temperature = 25
if temperature >= 30:
print("今日は真夏日です。")
elif temperature >= 20:
print("過ごしやすい気温です。")
elif temperature >= 10:
print("少し肌寒いですね。")
else:
print("防寒対策をしっかりしましょう。")
過ごしやすい気温です。
elifは何個でも繋げることができますが、上から順番に判定が行われ、最初に条件が一致したブロックだけが実行される点に注意してください。
比較演算子と論理演算子の活用
if文の条件式をより高度に制御するためには、比較演算子と論理演算子の理解が欠かせません。
数値や文字列を比較する演算子
Pythonで利用頻度の高い比較演算子を以下の表にまとめました。
| 演算子 | 意味 | 使用例 |
|---|---|---|
== | 等しい | a == b |
!= | 等しくない | a != b |
< | より小さい | a < b |
> | より大きい | a > b |
<= | 以下 | a <= b |
>= | 以上 | a >= b |
特に初心者が間違えやすいのが、代入の = と比較の == の混同です。
条件式では必ず == を使いましょう。
複数の条件を組み合わせる論理演算子
「AかつB」や「AまたはB」といった複雑な条件は、論理演算子(ブール演算子)を使って記述します。
- and:すべての条件が真のときにTrue
- or:いずれかの条件が真のときにTrue
- not:条件の真偽を反転させる
# andとorの組み合わせ
user_age = 25
has_license = True
if user_age >= 18 and has_license:
print("車の運転が可能です。")
is_weekend = True
is_holiday = False
if is_weekend or is_holiday:
print("今日は休みです!")
Pythonの論理演算子は、他言語のように && や || ではなく、「and」「or」「not」という英単語をそのまま使用するため、英文を読むように直感的に理解できるのが特徴です。
in演算子やis演算子による高度な判定
Python特有の便利な演算子に、in や is があります。
これらを使いこなすと、リストの検索やオブジェクトの比較が非常にスマートになります。
メンバーシップ演算子:in
リストや文字列の中に特定の要素が含まれているかを判定します。
allowed_users = ["alice", "bob", "charlie"]
current_user = "bob"
if current_user in allowed_users:
print(f"{current_user}さんはアクセスが許可されています。")
else:
print("アクセス権限がありません。")
bobさんはアクセスが許可されています。
同一性演算子:is
is 演算子は、2つの変数が「同じオブジェクトを指しているか」を判定します。
値が同じかどうかを判定する == とは厳密には異なります。
実務で最も多く使われるのは、「None」かどうかを判定する場合です。
data = None
if data is None:
print("データが存在しません。")
Pythonでは、None との比較には == ではなく is を使うことが推奨されています。
Truthy(真っぽい)とFalsy(偽っぽい)
Pythonのif文では、条件式に明示的な比較演算子を書かなくても、オブジェクトそのものの「真偽値」で判定を行うことができます。
偽(False)と判定される値
以下の値は、if文の条件式に入れると自動的に False とみなされます。
NoneFalse- 数値の
0,0.0 - 空の文字列
"" - 空のリスト
[], 空の辞書{}
# リストが空かどうかを判定する洗練された書き方
items = []
if not items:
print("リストは空です。")
このように、len(items) == 0 と書く代わりに、オブジェクトそのものの真偽評価を利用するのがPythonらしい(Pythonicな)記述方法です。
三項演算子(条件付き書式)によるコードの簡略化
if文による分岐が単純な代入やリターンだけの場合、「三項演算子(条件付き式)」を使うことで、コードを1行にまとめることができます。
基本構文
値1 if 条件式 else 値2
これは「条件式が真なら値1、偽なら値2を返す」という意味になります。
# 通常のif文
age = 22
if age >= 20:
message = "成人"
else:
message = "未成年"
# 三項演算子を使った書き方
message = "成人" if age >= 20 else "未成年"
print(message)
成人
三項演算子のメリットと注意点
三項演算子を使うとコードの行数が減り、変数の定義が1箇所で完結するため見通しが良くなるケースがあります。
しかし、複雑な条件を無理に1行に詰め込むと、逆に見づらくなってしまいます。
例えば、以下のようなネスト(入れ子)された三項演算子は避けるべきです。
# 避けるべき例:読みづらい!
result = "A" if score >= 90 else "B" if score >= 80 else "C"
可読性を優先し、複雑になる場合は通常のif-elif-else構造を使用しましょう。
Python 3.10以降のmatch文との使い分け
Python 3.10からは、他言語のswitch文に近い機能である「構造的パターンマッチング(match文)」が導入されました。
特定の変数の値に応じて多くの分岐を作る場合、if文よりもmatch文の方が綺麗に書けることがあります。
# match文の例
command = "start"
match command:
case "start":
print("システムを起動します。")
case "stop":
print("システムを停止します。")
case "restart":
print("システムを再起動します。")
case _:
print("不明なコマンドです。")
単純な数値や文字列の比較であればmatch文が有利ですが、「AかつB」といった複雑な論理条件や範囲指定が含まれる場合は、依然としてif文の方が適しています。
それぞれの特性を理解して使い分けましょう。
if文を美しく書くためのベストプラクティス
最後に、プロの現場でも通用する「読みやすいif文」を書くためのコツをいくつか紹介します。
1. ネストを深くしすぎない
if文の中にさらにif文を入れる「ネスト」が深くなると、コードの理解が困難になります。
# 悪い例
if user.is_active:
if user.has_permission:
if settings.is_enabled:
# 実行したい処理
このような場合は、「ガード節(早めに処理を終わらせる)」パターンを使って、ネストを浅く保ちます。
# 良い例
if not user.is_active:
return
if not user.has_permission:
return
if not settings.is_enabled:
return
# 実行したい処理(メインロジックが左側に寄る)
2. 否定文よりも肯定文を優先する
if not x != y: のような複雑な否定条件は、脳の負荷を高めます。
できるだけ if x == y: のように、直感的に理解しやすい肯定的な条件を記述するように心がけましょう。
3. ブール値との直接比較を避ける
if is_valid == True: と書く必要はありません。
if is_valid: と書くだけで十分です。
これは、変数がブール型であれば、その値自体が条件として評価されるためです。
まとめ
Pythonのif文は、プログラミングのロジックを構成する上で最も基礎となるツールです。
本記事では、基本の if, elif, else の使い方から、インデントの重要性、比較・論理演算子の活用、さらには簡潔なコードを書くための三項演算子まで幅広く解説しました。
重要なポイントを振り返りましょう。
- Pythonはインデント(スペース4つ)でブロックを表現する。
- 複数の条件には
elifを、どれにも当てはまらない場合にはelseを使う。 - 論理演算子
and,or,notを組み合わせて複雑な条件を記述できる。 - オブジェクトが「空」かどうかの真偽判定(Truthy/Falsy)を活用するとコードがシンプルになる。
- 1行で書きたいときは三項演算子、多岐にわたる値の分岐は
match文を検討する。
条件分岐をマスターすれば、データ分析、Web開発、自動化ツールの作成など、あらゆる場面で思い通りのプログラムが組めるようになります。
まずは基本に忠実なコードを書き、慣れてきたら三項演算子やガード節を取り入れて、より洗練されたPythonコードを目指してください。
