PR

基礎をつかんだら、Pythonの体系的な講座で一気に実力を伸ばすのも手です。

UdemyでPython講座を探す

アフィリエイト広告です。価格は変わりません。

解説ガイド

Pythonのif文 完全ガイド — 書き方・elif・条件式・つまずきポイント

Pythonのif文について、基本の形・条件式の書き方・よく使うパターン・つまずきやすい点を1ページにまとめました。順番に読んでも、目次から必要なところだけ拾っても使えます。

コード例はすべてその場で実行できます。書き換えて動かせるので、「こう書いたらどうなるんだろう」をそのまま試してください。ページに載っている実行結果は、公開前に実際に実行して得たものです。

1つずつ順番に練習したい方は、レッスン「条件分岐(if文)」から始めるのが近道です。

1. 基本の形

Pythonのif文は、条件式のうしろにコロン、その中身をインデント(字下げ)で書きます。他の多くの言語が使う波かっこ {} は使いません。どこまでがifの中身かを決めるのはインデントの深さです。

if だけ — 条件が成り立つときだけ実行する

いちばん短い形です。条件が True のときだけ、インデントされた行が実行されます。

Python
OUTPUT / 実行結果
大人です 判定おわり
最後の print("判定おわり") はインデントされていないので、if文の外です。条件に関係なく必ず実行されます。インデントされているかどうかだけが、中と外の違いです。

if / else — 2つに分ける

条件が成り立たないときの処理を else に書きます。else に条件は書けません。

Python
OUTPUT / 実行結果
子どもです
else の行末にもコロンが要ります。else のうしろに条件を書きたくなったら、それは次の elif です。

if / elif / else — 3つ以上に分ける

他の言語の else if にあたるのが elif です。上から順に評価され、最初に成り立ったものだけが実行されます。

Python
OUTPUT / 実行結果
B
85 は score >= 80score >= 70 の両方を満たしますが、先に見つかったBだけが表示されます。残りの elifelse は評価すらされません。この「上から順に、1つだけ」という性質のおかげで、範囲の判定は上限(または下限)から順に並べるだけで書けます。

順番を間違えるとどうなるか

同じ条件をゆるい順に並べてしまった例です。文法的には正しいので、エラーは出ません。

Python
OUTPUT / 実行結果
C
95点なのに「C」になりました。最初の score >= 70 がすでに成り立つので、そこで打ち切られるためです。エラーにならないぶん見つけにくい間違いで、範囲で分岐するときは厳しい条件から順に並べるのが鉄則です。

入れ子(ネスト)にする

if文の中にif文を書けます。インデントがもう1段深くなります。

Python
OUTPUT / 実行結果
入場できます
深くなるほど読みにくくなります。この例は if age >= 18 and has_ticket: のように and でまとめるか、あとで出てくる早期リターンで浅くできます。3段以上のネストは、たいてい書き方を変えたほうがよい合図です。

2. 条件式の書き方

if のうしろに書くのが条件式です。よく使うものを一通り並べます。

  • 比較: ==(等しい) !=(等しくない) < <= > >=
  • 論理: and(かつ) or(または) not(否定)
  • 所属: in(含まれる) not in
  • 同一性: is is not(None の判定に使う)

and・or・not でつなぐ

Pythonでは記号ではなく英単語で書きます。&&|| は使えません。

Python
OUTPUT / 実行結果
一般料金です 割引はありません
andor短絡評価をします。and は左が偽だと右を見ませんし、or は左が真だと右を見ません。この性質は if x is not None and x.name == "太郎" のように、安全を確かめてから中身を触る書き方に使えます。

範囲は連鎖比較でそのまま書ける

「10以上20未満」を、Pythonでは数式のまま書けます。多くの言語にはない書き方です。

Python
OUTPUT / 実行結果
すごしやすい気温です 同じ判定です
10 <= temp < 20temp を1回しか評価しないので、関数呼び出しを挟むときは and より効率的でもあります。読みやすさの面でも、範囲判定はこちらが素直です。

in で「含まれるか」を調べる

リスト・タプル・集合・文字列・辞書のどれにも使えます。複数の or を書きそうになったら in の出番です。

Python
OUTPUT / 実行結果
取り扱いがあります 文字列の一部としても含まれます ぶどうは在庫表にありません
辞書に対する inキーを見ます(値ではありません)。また、候補が多いときは {"りんご", "みかん"} のように集合にすると検索が速くなります。リストは先頭から順に探しますが、集合は一発で判定できるためです。

None の判定は is で書く

== None ではなく is None と書くのがPythonの決まりです。

Python
OUTPUT / 実行結果
名前が設定されていません 値はあります(0でもNoneではない)
is は「まったく同じもの」かを見ます。None はプログラム中に1つしかないので、この判定がいちばん確実で速いのです。== はクラス側で意味を書き換えられるため、None の判定に使うと予想外の結果になることがあります。2つ目の例のように、0 や空文字は「値がない」ではありません — この区別は次の節で詳しく見ます。

3. 真偽値として扱われる値(空リストは False)

Pythonのifは True / False 以外の値も受け取れて、それぞれに「真」「偽」の扱いが決まっています。ここを知っているかどうかで、書けるコードの短さがかなり変わります。

偽として扱われるのは、次のものだけです。それ以外はすべて真です。

  • False / None
  • 数値の 0(0.0 も)
  • 空の文字列 ""
  • 空のリスト []・タプル ()・辞書 {}・集合 set()

空かどうかを直接ifに書く

len(items) > 0 と書かなくても、そのまま判定できます。

Python
OUTPUT / 実行結果
商品がありません こんにちは、太郎さん
if items: は「itemsが空でなければ」の意味です。if len(items) > 0: と同じ結果になりますが、Pythonではこちらが標準的な書き方とされています。

落とし穴 — 0 と空文字も偽になる

「値が入っているか」を確かめたつもりが、0や空文字を「無い」と判定してしまうのはよくある不具合です。

Python
OUTPUT / 実行結果
値なしと判定された Noneではないので、0という値が入っている
在庫数・スコア・割引率のように 0が正当な値である場面で刺さります。「未設定」を表したいときは None を使い、判定は必ず is None / is not None で書く、と決めておくと事故が減ります。

4. よく使う書き方(逆引き)

「こう書きたい」から引けるように並べました。どれもif文を読みやすくするための定番です。

1行で分けたい → 三項演算子(条件式)

値を2つから選ぶだけのときは、1行で書けます。A if 条件 else B の順で、条件が真ならA。

Python
OUTPUT / 実行結果
子ども 料金は600円です
他の言語の 条件 ? A : B にあたりますが、順番が違います。Pythonは値が先で条件が後です。入れ子にすると急に読めなくなるので、2択までに留めるのが無難です。

ネストを浅くしたい → 早期リターン

「条件を満たさないときは、そこで抜ける」を先に書くと、本筋のインデントが1段で済みます。

Python
OUTPUT / 実行結果
1000円 無料 年齢が不正です
この形はガード節と呼ばれます。else を積み重ねる書き方に比べて、例外的なケースが上にまとまり、本筋の処理が最後にまっすぐ並びます。読み手にとっては「先に片付いた話」と「本題」が分かれるので追いやすくなります。

分岐が多い → 辞書で置き換える

「値によって別の値を返すだけ」の elif の列は、辞書1つで表せます。

Python
OUTPUT / 実行結果
0.2 0.1 0
if rank == "gold": ... elif rank == "silver": ... と書くのに比べて、ランクを追加するときに変えるのがデータ1行だけになります。.get(キー, 既定値) は、キーが無いときにエラーではなく既定値を返すのが便利なところです。分岐の中身が「値を返す」以上のことをするなら、辞書に関数を入れる手もあります。

値のパターンで分けたい → match文

Python 3.10 で入った構文です。他の言語の switch に近いものですが、もう少し強力です。

Python
OUTPUT / 実行結果
northへ移動します あたりを見回します 2個拾います わかりません
単に値を比べるだけなら if や辞書で十分です。形(要素数や構造)で分けたいときにmatchが効きます。case _: はどれにも当てはまらなかったときで、他の言語の default にあたります。

「どれか1つでも」「すべて」→ any と all

複数の条件を orand で長くつなぐ代わりに使えます。

Python
OUTPUT / 実行結果
90点以上の人がいます 全員が60点以上です False True
最後の行が要注意です。空のリストに対して all()True を返します(「反例が1つもない」ため)。「全員が合格なら通知する」といった処理で、対象が0人のときに誤って通知してしまう原因になります。if scores and all(...) のように、空でないことも一緒に確かめると安全です。

リストを条件で絞りたい → 内包表記のif

forif を1行にまとめて、条件に合う要素だけの新しいリストを作れます。

Python
OUTPUT / 実行結果
[2, 4, 6] ['奇数', '偶数', '奇数', '偶数', '奇数', '偶数']
ifの位置で意味が変わります。うしろにある for n in numbers if 条件絞り込み、前にある A if 条件 else B for ...置き換えです。前に置く形では else が必須で、書き忘れると構文エラーになります。

5. つまずきポイント(エラーの原因別)

if文まわりで実際によく出るエラーと、その原因です。ここに挙げた壊れた例はわざとエラーになる形なので、実行ボタンは付けていません。直した形と見比べてください。

SyntaxError — コロンの書き忘れ

if elif else の行末には、必ずコロンが必要です。

Python(エラーになる例)
age = 20

if age >= 18      # ← コロンがない
    print("大人です")
SyntaxError になります。エラーの表示はコロンが無い行を指します。for while def class も同じで、ブロックが始まる行はすべてコロンで終わると覚えるのが早いです。

IndentationError — 字下げが無い・ずれている

コロンで始めたブロックの中身は、必ず1段深くします。

Python(エラーになる例)
age = 20

if age >= 18:
print("大人です")   # ← 字下げされていない
IndentationError になります。逆に、必要のないところで字下げしても同じ種類のエラーです。字下げの量に決まりはありませんが、スペース4つが慣習で、同じブロックの中で揃っていることが条件です。

TabError — タブとスペースの混在

見た目は揃っているのにエラーになる、いちばん気づきにくい型です。

Python(エラーになる例)
if True:
    print("スペース4つで字下げ")
	print("こちらはタブで字下げ")   # ← 見た目は同じでもエラー
TabError になります。画面上ではどちらも同じ幅に見えるため、原因にたどり着きにくいエラーです。エディタで「タブをスペースに変換」を有効にしておくのが唯一の確実な予防策で、VS Codeなら既定で有効になっています。

= と == の取り違え

= は代入、== は比較です。条件式に = は書けません。

Python(エラーになる例)
age = 20

if age = 18:      # ← 比較のつもりで代入を書いている
    print("18歳です")
SyntaxError になります。C言語などでは条件式に代入を書けてしまい、気づかないまま動く不具合になりますが、Pythonは文法として禁止しているので必ず止まります。この点はPythonのほうが安全です。

== で小数を比べると成り立たない

エラーは出ませんが、直感に反する結果になります。

Python
OUTPUT / 実行結果
等しくない 0.30000000000000004 十分に近い
コンピュータが小数を2進数で持つために起きる、Pythonに限らないすべての言語に共通の性質です。金額のように誤差が許されない場面では、decimal.Decimal を使うか、そもそも整数(円単位)で扱います。

is で数値や文字列を比べない

小さな整数だと「たまたま動いてしまう」ため、余計にたちが悪い間違いです。

Python
OUTPUT / 実行結果
True False True
まったく同じ形の比較なのに、値の大きさで結果が変わりました。Pythonが小さな整数(-5〜256)を使い回しているためです。この使い回しは実装の都合であって、言語の約束ではありません — Pythonのバージョンや書き方が変わると結果も変わります。isNoneTrueFalse の判定にだけ使い、値の比較は == と覚えてください。

よくある質問

Pythonに switch 文はありますか?

従来のswitch文はありません。Python 3.10 以降には match 文があり、値だけでなくデータの形でも分岐できます。単に値を比べるだけなら ifelif か、辞書を使った書き方のほうが簡潔です。

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テーマの練習ページで実際に書いて確かめられます。

広告スペース(バナー)
広告スペース(記事内)