Pythonはインデント(スペース4文字)でブロックを表す

Posted: | Tags: Python

Pythonではインデント(行頭の空白、字下げ)でブロックを表す。

文法上のルールではタブを使ってもよいし何文字でもよいが、コーディング規約PEP8では半角スペース4文字の使用が推奨されている。

Pythonはインデントでブロックを表す

Pythonでは、if文やfor文などの複合文においてグループ(ブロック)を表すために、他の多くのプログラミング言語のような括弧ではなく、インデント(行頭の空白、字下げ)を使う。

Guido van Rossum の信じるところによれば、インデントによるグループ化は非常にエレガントで、普通の Python プログラムを大いに読みやすくします。しばらくすればほとんどの人はこの仕様を気に入るようになります。 デザインと歴史 FAQ - Python はなぜ文のグループ化にインデントを使うのですか? — Python 3.11.3 ドキュメント

for i in range(3):
    print(i)
# 0
# 1
# 2

ブロック内のブロック(ネストした複合文)はインデントレベル(空白の個数、字下げ幅)を増やして表現する。以下は、defによる関数定義、forによる繰り返し、ifによる条件分岐を同時に使う例。

def test(n):
    for i in range(n):
        if i % 2:
            print(i * 10)
        else:
            print(i)
    print('FINISH')

test(5)
# 0
# 10
# 2
# 30
# 4
# FINISH

コーディング規約PEP8はスペース4文字のインデントを推奨

コーディング規約PEP8は、インデントにはスペース4文字を使うことを推奨している。特に何か強い理由が無いのであればこれに従っておけばよい。

Use 4 spaces per indentation level. PEP 8 - Indentation – Style Guide for Python Code | peps.python.org

Spaces are the preferred indentation method. PEP 8 - Tabs or Spaces? – Style Guide for Python Code | peps.python.org

なお、Pythonに対応したエディタやIDEではTabキーでスペース4文字が挿入されるようになっていることが多い。わざわざスペースキーを4回押す必要はない。

また、例えばJupyter Notebookでは、複数行を選択してTabキーを押すと一括でまとめてスペース4文字分のインデントが増やされ、Shift + Tabでスペース4文字分のインデントが減らされる。Python拡張機能を追加したVSCodeなどでも同様のショートカットキーが利用可能。

文法上はスペースでもタブでも何文字でもいい

文法上はインデントの書き方は規定されていない。スペースでもタブでも、何文字でもいい。

以下のようなコードも文法上はエラーにならない。

def test(n):
 for i in range(n):
   if i % 2:
                print(i * 10)
   else:
    print(i)
 print('FINISH')

test(5)
# 0
# 10
# 2
# 30
# 4
# FINISH

あくまでも文法上は問題ないというだけなので、特に何か強い理由が無いのであればスペース4文字を使えばよい。

なお、ifelseのような同一のインデントレベルの文字数・幅は合わせる必要があるので注意。一致していないとインデントエラー(IndentationError)になる。

# def test(n):
#  for i in range(n):
#    if i % 2:
#                 print(i * 10)
#      else:
#        print(i)
#  print('FINISH')
# IndentationError: unindent does not match any outer indentation level

ブロック内が単純文のみの場合はインデントなしでもよい

ブロック内が単純文(式やreturn文など)のみで構成される場合は、インデントなしで書くことも可能。コロン:の後ろに改行無しで単純文を続けて書けばよい。

def test(n):
    print(n)

test(5)
# 5
def test(n):print(n)

test(5)
# 5

複数の単純文をセミコロン;で区切って一行で書くこともできる。

単純文とは、単一の論理行内に収められる文です。単一の行内には、複数の単純文をセミコロンで区切って入れることができます。 7. 単純文 (simple statement) — Python 3.11.3 ドキュメント

def test(n):
    n += 10
    print(n)
    print('FINISH')

test(5)
# 15
# FINISH
def test(n):n += 10;print(n);print('FINISH')

test(5)
# 15
# FINISH

この書き方ができるのはブロック内が単純文のみである場合だけ。ブロック内に複合文が含まれる場合はインデントが必須。

def test(n):
    for i in range(n):
        print(i)

test(3)
# 0
# 1
# 2
# def test(n):for i in range(n):print(i)
# SyntaxError: invalid syntax
def test(n):
    for i in range(n):print(i)

test(3)
# 0
# 1
# 2

この書き方もあくまでも文法上は問題ないというだけなので、特に強い理由がなければあえて使う必要はない。

関連カテゴリー

関連記事