Python♪基本:Pythonのインデントと命令文の影響範囲

 Pythonでは、プログラムの命令文の実行の順序や影響範囲を示すのに「インデント」を使います。「インデント」とは文のはじめの空白のことです。Pythonでは、繰り返し計算の命令文であるfor文や、条件分岐の命令文であるif文の影響範囲を「インデント」で示します。

1.Pythonのインデントと命令文の影響範囲

 インデントには半角スペースかタブを使い、全角スペースは使えません。また、インデントの大きさは決められていませんが、できるだけタブは使わず、4の倍数個の半角スペースを用いることが推奨されています。

 Pythonでは原則として、インデントの大きさはそろえなければなりません。この原則を外れることができるのは、for文やif文といった特別な命令文(命令文の最後に「:」がある命令文)のみです。
 for文やif文は、for文やif文が影響する範囲を示すために、影響範囲のインデントを大きくしなければなりません。ただし、その影響範囲内の命令文同士も、インデントの大きさをそろえなければならないという原則は同じです。
 そして、インデントの大きさが同じところは、特別な命令がなければ前から順番に実行します。

(1) サンプルコード01

 コード01をみてみましょう。2行目の命令文「for i in range(5):」、3行目「if i < 2:」、5行目「else:」の後は影響範囲を示すためにインデントの大きさが変化していますが、それ以外ではインデントの大きさがそろっています。

 2行目の命令文「for i in range(5):」は繰り返し計算を行う命令文ですので、インデントの下がった3~6行目を5回繰り返します。また、3行目の「if i < 2:」の影響範囲は4行目「print(str(i) + ’は1以下’)」ですので、iが2より小さい場合は4行目を実行します。同様に5行目「else:」の影響範囲は6行目ですので、iが2以上の場合は6行目を実行します。

 例えれば会社の組織図みたいなものです。2, 7, 8行目は部長。でも、7,8行目の部長には部下がいない。2行目のfor部長は、「if i<2:」と「else:」の2人の課長を従えていて、それぞれの課長は1人ずつ部下がいる。(変なたとえをすると、ますます分からなくなることが多いですね。すみません・・・)

 

#コード01_Python
for i in range(5):
    if i < 2:
        print(str(i) + 'は1以下')
    else:
        print(str(i) + 'は2以上')
str1 = 'プログラム終了'
print(str1)
#出力01
0は1以下
1は1以下
2は2以上
3は2以上
4は2以上
プログラム終了

 

(2) サンプルコード02

 コード02では、for文の影響範囲はインデントが大きい3~8行目となります。しかし、3~6行目と7,8行目でインデントがそろっていないので、エラーとなります。

#コード02_Python
for i in range(5):
    if i < 2:
        print(str(i) + 'は1以下')
    else:
        print(str(i) + 'は2以上')
  str1 = 'プログラム終了'
  print(str1)
#出力02
IndentationError: unindent does not match any outer indentation level

(3) サンプルコード03

 次にコード03を見てみましょう。コード03は、3~8行目のインデントの大きさをそろえました。4,6行目は、if文の影響で下がっているので文法的にエラーはありません。もちろん、コード01とはfor文の影響範囲が違うので、実行結果は変わります。7, 8行目もfor文の影響範囲に入りますので、'プログラム終了'が5回出力されます。

#コード03_Python
for i in range(5):
    if i < 2:
        print(str(i) + 'は1以下')
    else:
        print(str(i) + 'は2以上')
    str1 = 'プログラム終了'
    print(str1)
#出力03
0は1以下
プログラム終了
1は1以下
プログラム終了
2は2以上
プログラム終了
3は2以上
プログラム終了
4は2以上
プログラム終了

(4) サンプルコード04

 コード04では、4行目と6行目のインデントの大きさが違いますが、文法的に問題ありません。インデントをそろえなければならないのは、同じ影響範囲内でのことです。4行目は3行目の「id i < 2:」の影響範囲であり、5行目は4行目「else:」の影響範囲であり、4行目と6行目は、同じ命令文の影響範囲ではないので、そろえる必要はありません。

#コード04_Python
for i in range(5):
    if i<2:
      print(str(i)+'は1以下')
    else:
          print(str(i)+'は2以上')
str1 = 'プログラム終了'
print(str1)

 

1.C言語、VBAとの比較

 以下はC言語と、ExcelのVBAのコードです。C言語では{}で命令文の影響範囲を示します。ExcelのVBAでは、for文の影響範囲の終わりはNext、if文の影響範囲の終わりはEnd Ifで示します。したがって、C言語やVBAでもコードを読みやすくするためにインデントを設定するのが一般的ですが、文法的にインデントは不要です。

(1) C言語のコード

// コード05_C言語
#include <stdio.h>

int main()
{
  int i;
  char str1[] = "プログラム終了";

  for (i = 0; i < 5; i++) {
    if (i < 2) {
      printf("%dは1以下\n", i);
    } else {
      printf("%dは2以上\n", i);
    }
  }
  printf("%s\n", str1);
}

 

(2) ExcelのVBAのコード

'コード06_ExcelのVBA
Sub test()
  Dim i As Integer '省略可能

  For i = 0 To 4 Step 1
    If i < 2 Then
      Debug.Print Str(i) & "は1以下"
    Else
      Debug.Print Str(i) & "は2以上"
   End If
  Next i
  str1 = "プログラム終了"
  Debug.Print str1
End Sub

3.まとめ

(1) Pythonではインデントで、命令文の影響範囲を示します。

(2) インデントには半角スペースかタブを使い、全角スペースは使えません。また、インデントの大きさは決められていませんが、できるだけタブは使わず、4の倍数個の半角スペースを用いることが推奨されています。

(3) Pythonでは原則として、インデントの大きさはそろえなければなりません。この原則を外れることができるのは、for文やif文といった特別な命令文(命令文の最後に「:」がある命令文)のみです。

(4) インデントの大きさが同じところは、特別な命令がなければ前から順番に実行します。