Python

文法

決してPython独自の特徴ではないが、しばしば代表的な文法的特徴として挙げられるのが、「インデント(字下げ)」である。Pythonではブロック構造を記述するためにインデントを用いる。ブロック構造は、他のメジャーなプログラミング言語(たとえばC言語など)においては、カーリーブラケット("{ }"。「中括弧」と呼ばれる)を用いて表記されることが多い。しかし、Pythonではこれを行頭からの空白(インデント)によって表記する。これは、「見た目のブロック構造」と「実際の論理的な制御構造」を結びつける手法であり、視覚に訴えるコードの使用を強制する、という意義をもつ。以下に、C言語とPythonで再帰呼び出しを用いて階乗を計算する例を示す。Pythonのコード:
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
わかりやすく整形されたC言語のコード:
int factorial(int x)
{
    if(x == 0) {
        return 1;
    } else {
        return x * factorial(x - 1);
    }
}
この例では、Pythonと整形されたC言語とでは、プログラムコードの間に違いがほとんど見られない。しかし、C言語のコードに施されたインデントは(言語仕様においては)単なるコーディングスタイルのひとつにすぎないため、C言語では(言語仕様においては)全く同じプログラムを以下のように書くこともできる。わかりにくいC:
int factorial(int x) {
 if(x == 0) {return 1;} else
 {return x * factorial(x - 1); } }
Pythonではインデントは単なるスタイルではなく、必須の文法であるため、こうした書き方は許されていない。Pythonではこのような強制を課すことによって、プログラムのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。インデントによる整形は、単に「見かけ」だけではなく品質そのものにも関係する。例として次のコードを示す。間違えたC:
if (x > 10)
    x = 10;
    y = 0;
このコードは文法的には正しいが、言語仕様上のブロックの範囲と、インデントが表現するそれとが異なっているため、プログラマの意図が曖昧になる。この曖昧さは、検知しにくい不具合を生む原因になり得る。ソースコードを読む際、多くの人はインデントのような空白によって明確に整列されたコードを目安として読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、文法は正しく、見た目も一見正しく見えるような不具合を作成してしまう危険性がある。Pythonでは、インデントを文法の一部に組み入れることにより、人間が目視するソースコードの理解と、コンパイラの構文解析の間の誤差を少なくすることで、より正確に意図した通りにコーディングすることができるようになっている。

戻る