3秒でわかる
行頭の字下げのこと。Pythonでは見た目を整える習慣ではなく文法そのもので、量がずれるとエラーになるか結果が変わります。
もう少し詳しく
どういうものか
インデントは行頭に入れる空白のことです。多くの言語では読みやすさのための習慣にすぎませんが、Pythonでは処理のまとまりを表す文法として扱われます。if や for や def の行末にコロンを書き、次の行から字下げした範囲が、そのブロックの中身になります。
字下げの量は、半角スペース4つが公式スタイルガイドの推奨です。同じブロックの中で量がそろっていれば2つでも動きますが、そろえる意味でも4つに統一します。
なぜ必要か
他の言語が波かっこで囲んで表す範囲を、Pythonは字下げだけで表します。かっこが無いぶん記号が減って読みやすく、「見た目のインデントと実際の処理範囲が食い違う」という事故が起きません。C系の言語では、字下げは深いのにかっこが閉じていて範囲外だった、という読み間違いが起こり得ます。Pythonでは見えているものがそのまま範囲です。
具体例
字下げの位置が1段違うだけで、処理される回数が変わります。
total = 0
for price in [100, 200, 300]:
total += price
print(total) # <a href="/glossary/loop" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">ループ</a>の中なので3回出力される
total = 0
for price in [100, 200, 300]:
total += price
print(total) # ループの外なので最後に1回だけ上は 100 / 300 / 600 と3行出力され、下は 600 の1行だけです。エラーにならず結果だけが変わるので、この違いは自分で気づくしかありません。
つまずきやすいところ
最も多いのが、タブとスペースの混在です。画面上は同じ幅に見えても、Pythonは別の文字として扱い TabError になります。エディタで「タブをスペースに変換」の設定を有効にしておけば起きません。
次に多いのが、コピーした行の字下げが1段深いままになるケースです。IndentationError: unexpected indent はこれが原因です。逆に、if の中身を書き忘れて次の行を字下げしないと IndentationError: expected an indented block になります。中身を後で書くつもりなら pass を1行置いておきます。
if stock == 0:
pass # 後で在庫切れの処理を書く似た用語との違い
インデントは行頭の字下げ、ブロックは字下げによってできた処理のまとまりを指します。字下げは手段で、ブロックが結果です。JavaScriptやJavaで言えば、インデントに相当するのが空白、ブロックに相当するのが波かっこの中身です。