Pythonのif文 完全ガイド — 書き方・elif・条件式・つまずきポイント
Pythonのif文について、基本の形・条件式の書き方・よく使うパターン・つまずきやすい点を1ページにまとめました。順番に読んでも、目次から必要なところだけ拾っても使えます。
コード例はすべてその場で実行できます。書き換えて動かせるので、「こう書いたらどうなるんだろう」をそのまま試してください。ページに載っている実行結果は、公開前に実際に実行して得たものです。
1つずつ順番に練習したい方は、レッスン「条件分岐(if文)」から始めるのが近道です。
1. 基本の形
Pythonのif文は、条件式のうしろにコロン、その中身をインデント(字下げ)で書きます。他の多くの言語が使う波かっこ {} は使いません。どこまでがifの中身かを決めるのはインデントの深さです。
if だけ — 条件が成り立つときだけ実行する
いちばん短い形です。条件が True のときだけ、インデントされた行が実行されます。
print("判定おわり") はインデントされていないので、if文の外です。条件に関係なく必ず実行されます。インデントされているかどうかだけが、中と外の違いです。if / else — 2つに分ける
条件が成り立たないときの処理を else に書きます。else に条件は書けません。
else の行末にもコロンが要ります。else のうしろに条件を書きたくなったら、それは次の elif です。if / elif / else — 3つ以上に分ける
他の言語の else if にあたるのが elif です。上から順に評価され、最初に成り立ったものだけが実行されます。
score >= 80 と score >= 70 の両方を満たしますが、先に見つかったBだけが表示されます。残りの elif と else は評価すらされません。この「上から順に、1つだけ」という性質のおかげで、範囲の判定は上限(または下限)から順に並べるだけで書けます。順番を間違えるとどうなるか
同じ条件をゆるい順に並べてしまった例です。文法的には正しいので、エラーは出ません。
score >= 70 がすでに成り立つので、そこで打ち切られるためです。エラーにならないぶん見つけにくい間違いで、範囲で分岐するときは厳しい条件から順に並べるのが鉄則です。入れ子(ネスト)にする
if文の中にif文を書けます。インデントがもう1段深くなります。
if age >= 18 and has_ticket: のように and でまとめるか、あとで出てくる早期リターンで浅くできます。3段以上のネストは、たいてい書き方を変えたほうがよい合図です。2. 条件式の書き方
if のうしろに書くのが条件式です。よく使うものを一通り並べます。
- 比較:
==(等しい)!=(等しくない)<<=>>= - 論理:
and(かつ)or(または)not(否定) - 所属:
in(含まれる)not in - 同一性:
isis not(Noneの判定に使う)
and・or・not でつなぐ
Pythonでは記号ではなく英単語で書きます。&& や || は使えません。
and と or は短絡評価をします。and は左が偽だと右を見ませんし、or は左が真だと右を見ません。この性質は if x is not None and x.name == "太郎" のように、安全を確かめてから中身を触る書き方に使えます。範囲は連鎖比較でそのまま書ける
「10以上20未満」を、Pythonでは数式のまま書けます。多くの言語にはない書き方です。
10 <= temp < 20 は temp を1回しか評価しないので、関数呼び出しを挟むときは and より効率的でもあります。読みやすさの面でも、範囲判定はこちらが素直です。in で「含まれるか」を調べる
リスト・タプル・集合・文字列・辞書のどれにも使えます。複数の or を書きそうになったら in の出番です。
in はキーを見ます(値ではありません)。また、候補が多いときは {"りんご", "みかん"} のように集合にすると検索が速くなります。リストは先頭から順に探しますが、集合は一発で判定できるためです。None の判定は is で書く
== None ではなく is None と書くのがPythonの決まりです。
is は「まったく同じもの」かを見ます。None はプログラム中に1つしかないので、この判定がいちばん確実で速いのです。== はクラス側で意味を書き換えられるため、None の判定に使うと予想外の結果になることがあります。2つ目の例のように、0 や空文字は「値がない」ではありません — この区別は次の節で詳しく見ます。3. 真偽値として扱われる値(空リストは False)
Pythonのifは True / False 以外の値も受け取れて、それぞれに「真」「偽」の扱いが決まっています。ここを知っているかどうかで、書けるコードの短さがかなり変わります。
偽として扱われるのは、次のものだけです。それ以外はすべて真です。
False/None- 数値の
0(0.0も) - 空の文字列
"" - 空のリスト
[]・タプル()・辞書{}・集合set()
空かどうかを直接ifに書く
len(items) > 0 と書かなくても、そのまま判定できます。
if items: は「itemsが空でなければ」の意味です。if len(items) > 0: と同じ結果になりますが、Pythonではこちらが標準的な書き方とされています。落とし穴 — 0 と空文字も偽になる
「値が入っているか」を確かめたつもりが、0や空文字を「無い」と判定してしまうのはよくある不具合です。
None を使い、判定は必ず is None / is not None で書く、と決めておくと事故が減ります。4. よく使う書き方(逆引き)
「こう書きたい」から引けるように並べました。どれもif文を読みやすくするための定番です。
1行で分けたい → 三項演算子(条件式)
値を2つから選ぶだけのときは、1行で書けます。A if 条件 else B の順で、条件が真ならA。
条件 ? A : B にあたりますが、順番が違います。Pythonは値が先で条件が後です。入れ子にすると急に読めなくなるので、2択までに留めるのが無難です。ネストを浅くしたい → 早期リターン
「条件を満たさないときは、そこで抜ける」を先に書くと、本筋のインデントが1段で済みます。
else を積み重ねる書き方に比べて、例外的なケースが上にまとまり、本筋の処理が最後にまっすぐ並びます。読み手にとっては「先に片付いた話」と「本題」が分かれるので追いやすくなります。分岐が多い → 辞書で置き換える
「値によって別の値を返すだけ」の elif の列は、辞書1つで表せます。
if rank == "gold": ... elif rank == "silver": ... と書くのに比べて、ランクを追加するときに変えるのがデータ1行だけになります。.get(キー, 既定値) は、キーが無いときにエラーではなく既定値を返すのが便利なところです。分岐の中身が「値を返す」以上のことをするなら、辞書に関数を入れる手もあります。値のパターンで分けたい → match文
Python 3.10 で入った構文です。他の言語の switch に近いものですが、もう少し強力です。
if や辞書で十分です。形(要素数や構造)で分けたいときにmatchが効きます。case _: はどれにも当てはまらなかったときで、他の言語の default にあたります。「どれか1つでも」「すべて」→ any と all
複数の条件を or や and で長くつなぐ代わりに使えます。
all() は True を返します(「反例が1つもない」ため)。「全員が合格なら通知する」といった処理で、対象が0人のときに誤って通知してしまう原因になります。if scores and all(...) のように、空でないことも一緒に確かめると安全です。リストを条件で絞りたい → 内包表記のif
for と if を1行にまとめて、条件に合う要素だけの新しいリストを作れます。
for n in numbers if 条件 は絞り込み、前にある A if 条件 else B for ... は置き換えです。前に置く形では else が必須で、書き忘れると構文エラーになります。5. つまずきポイント(エラーの原因別)
if文まわりで実際によく出るエラーと、その原因です。ここに挙げた壊れた例はわざとエラーになる形なので、実行ボタンは付けていません。直した形と見比べてください。
SyntaxError — コロンの書き忘れ
if elif else の行末には、必ずコロンが必要です。
age = 20
if age >= 18 # ← コロンがない
print("大人です")for while def class も同じで、ブロックが始まる行はすべてコロンで終わると覚えるのが早いです。IndentationError — 字下げが無い・ずれている
コロンで始めたブロックの中身は、必ず1段深くします。
age = 20
if age >= 18:
print("大人です") # ← 字下げされていないTabError — タブとスペースの混在
見た目は揃っているのにエラーになる、いちばん気づきにくい型です。
if True:
print("スペース4つで字下げ")
print("こちらはタブで字下げ") # ← 見た目は同じでもエラー= と == の取り違え
= は代入、== は比較です。条件式に = は書けません。
age = 20
if age = 18: # ← 比較のつもりで代入を書いている
print("18歳です")== で小数を比べると成り立たない
エラーは出ませんが、直感に反する結果になります。
decimal.Decimal を使うか、そもそも整数(円単位)で扱います。is で数値や文字列を比べない
小さな整数だと「たまたま動いてしまう」ため、余計にたちが悪い間違いです。
is は None・True・False の判定にだけ使い、値の比較は == と覚えてください。よくある質問
Pythonに switch 文はありますか?
従来のswitch文はありません。Python 3.10 以降には match 文があり、値だけでなくデータの形でも分岐できます。単に値を比べるだけなら if・elif か、辞書を使った書き方のほうが簡潔です。
elif と else if はどちらが正しいですか?
Pythonでは elif です。else if(スペース区切り)や elseif は他の言語の書き方で、Pythonでは構文エラーになります。
インデントはスペース何個にすべきですか?
スペース4つが慣習です(公式のスタイルガイド PEP 8 の推奨)。文法上は同じブロック内で揃っていれば何個でも動きますが、他人が読むコードでは4つに合わせるのが無難です。タブとスペースを混ぜるとエラーになるので、エディタでタブをスペースに変換する設定にしておきましょう。
if文の中で何もしたくないときはどう書きますか?
pass と書きます。Pythonはブロックを空にできないため、「あとで書く」「意図的に何もしない」を表す文が必要です。
空のリストかどうかは len() で調べるべきですか?
if items: と直接書くのがPythonらしい書き方です。空のリストは偽として扱われます。ただし、0 や空文字も偽になるので、「値が設定されているか」を調べたいときは is not None を使ってください。
条件が長くなって1行に収まりません。
条件全体を丸かっこで囲むと、途中で改行できます。行末にバックスラッシュを置く方法もありますが、かっこのほうが安全で読みやすく、こちらが推奨されています。
📘 手を動かして覚える(関連レッスン)
ここで読んだ内容は、1レッスン=1テーマの練習ページで実際に書いて確かめられます。