Python | 文法の基本:Python のインデント

Python
スポンサーリンク

インデントの役割(Pythonで「見た目」が文法になる)

Pythonのインデントは、コードの「まとまり(ブロック)」を示すための文法そのものです。if、for、while、def、class、try などの行末にコロン(:)が付くと、新しいブロックが始まります。その次の行からインデントを下げて書くことで「この中身は同じグループ」と伝えます。中括弧 {} の代わりにインデントで構造を表す、これがPythonの特徴です。


基本ルール(4スペース、コロン、揃える)

コロンでブロック開始、次の行からインデント

コロン(:)の行は「ここからブロックが始まる」という合図です。次の行からインデントを下げ、同じ深さの行が同じブロックになります。

score = 85
if score >= 80:
    print("合格です!")     # ← ブロック内
    print("よくがんばりました!")  # ← ブロック内
Python

インデント幅は4スペースが推奨(PEP 8)

タブではなくスペースを使い、1段のインデントは「半角スペース4つ」が推奨です。タブとスペースの混在はエラーや誤判定の原因になります。

def greet(name):
    if not name:
        return "名無し"
    return f"こんにちは、{name}さん"
Python

同じブロックは「同じだけ」下げる

ブロック内のすべての行は、同じインデント幅で揃えます。ズレていると IndentationError になります。

# 悪い例(インデントがバラバラ)
if True:
  print("A")
    print("B")  # エラー
Python

よくあるエラーと対策(重要ポイント)

IndentationError と TabError

コロンの次の行がインデントされていない、または深さが不一致だと IndentationError。タブとスペースが混じると TabError が起こりやすくなります。エディタ設定で「タブをスペースに変換」「インデント幅4」を有効にしてください。

ブロックの終わりは「インデントを戻す」

ブロックが終わる場所では、元の深さに戻します。else、elif、except、finally は「直前の if/try と同じ深さ」に置くのが基本です。

age = 17
if age >= 18:
    print("成人")
else:  # if と同じ深さに戻る
    print("未成年")
Python

コロンの付け忘れ

if、for、while、def、class、try の行末にコロンがないと、構文エラーになります。コロンは「ブロック開始の宣言」です。

# 悪い例(コロンがない)
# if x > 0
#     print("正")
Python

ネストの考え方(深さが意味を決める)

ネストは「ブロックの中にブロック」を作ることです。深さが増えるほど内側の文脈になります。読みやすさのため、ネストはできるだけ浅く保ち、早期リターンで分岐を減らすと保守が楽になります。

def can_buy(age, stock, suspended):
    if suspended:
        return False           # 早期終了でネストを浅く
    if age < 18:
        return False
    if stock <= 0:
        return False
    return True
Python

複数行の式とハンギングインデント(整形のコツ)

かっこ内の改行は追加インデントで揃える

丸括弧 ()、角括弧 []、波括弧 {} の中は、バックスラッシュを使わずに改行できます。先頭をそろえる「ハンギングインデント」で読みやすくします。

total = (
    120
    + 340
    + 560
)

items = [
    "apple",
    "banana",
    "orange",
]
Python

引数が多い関数呼び出しの整形

1行が長くなる場合は、括弧で括って改行し、引数ごとに縦にそろえます。

send_mail(
    to="hanako@example.com",
    subject="レポート",
    body="お疲れさまです。",
)
Python

例題で身につける(正しいインデントの型)

例題1:if / elif / else のブロック

score = 85
if score >= 90:
    grade = "A"
elif score >= 80:  # elif は if と同じ深さ
    grade = "B"
elif score >= 70:
    grade = "C"
else:              # else も同じ深さ
    grade = "D"
print(f"評価: {grade}")
Python

例題2:for と関数定義のネスト

def classify(scores):
    result = []
    for s in scores:           # for の中身を1段下げる
        if s >= 80:
            result.append("Good")
        else:
            result.append("Try")
    return result

print(classify([70, 85, 90]))  # ["Try", "Good", "Good"]
Python

例題3:try / except / else / finally の深さ

def to_int(text):
    try:
        value = int(text.strip())
    except ValueError:
        return None
    else:               # 例外が出なかったとき
        return value
    finally:
        pass            # 後始末(今回は何もしない)
Python

例題4:with 文のネストと揃え

from pathlib import Path

path = Path("data.txt")
with path.open("w", encoding="utf-8") as f:
    f.write("Hello\n")
    f.write("World\n")
Python

実務で役立つ整形の習慣(読みやすさを最優先)

行の長さと改行の判断

長くなる式や文字列は、かっこでくくって適切に改行します。「意味の塊」ごとに縦に揃えると、構造が一目で分かります。

query = (
    "SELECT id, name, score "
    "FROM users "
    "WHERE score >= 80 "
    "ORDER BY score DESC"
)
Python

エディタ設定と自動整形

「タブ→スペース変換」「インデント幅4」「可視化(不可視文字の表示)」をオンにし、必要なら自動整形ツール(black)や静的解析(flake8)を使うと、インデントの乱れを防げます。チームでも統一され、レビューが楽になります。


まとめ(押さえるべき重要ポイント)

Pythonのインデントは「見た目」ではなく「文法」です。コロンでブロック開始、次の行から4スペースでインデント、同じブロックは同じ深さに揃える——この3点が核になります。else/elif/except/finally は親の深さに戻す、かっこ内改行はハンギングインデントで整える、タブ混在は避ける。エディタ設定を整え、ネストを浅く保つ習慣をつければ、読みやすく誤りの少ないPythonコードが自然と書けるようになります。

タイトルとURLをコピーしました