Python♪基本:Pythonは変数や引数の宣言が不要。C言語、VBAとの比較

 Pythonのコードをコード01、C言語のコードをコード02、ExcelのVBAのコードをコード03に示します。それぞれの言語の特徴が出ていると思います。こうして比べてみると確かにPythonってコードが短いですね。でも、感激するほど短くなるのは、Numpyのような便利な拡張モジュールを使ったときです。

 このコードでの長さの違いは、それぞれのプログラミング言語の設計思想が違うだけなので、どれがよいというわけではありません。ここでは、Pythonの命令文の短さを自慢するのでは無く、それぞれのプログラムの特徴について説明します。

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

 C言語では{}で命令文の影響範囲を示します。ExcelのVBAでは、for文の影響範囲の終わりはNext、if文の影響範囲の終わりはEnd Ifで示します。したがって、C言語やVBAでもコードを読みやすくするためにインデントを設定するのが一般的ですが、文法的にインデントは不要です。
 Pythonではインデントの書式を強制することで、誰がコーディングしても似たようなコードになり、他の人のコードを読みやすいという利点があります。詳細は以下の記事に示します。

参考記事:
基本:Pythonのインデントと命令文の影響範囲

2.変数や引数の宣言が不要

 Pythonでは変数や引数の宣言が不要です。正確には、変数に値を代入したときに変数の宣言が自動的に行われます。したがって、いきなり、print(c)とすると「NameError: name 'c' is not defined」cが定義されていないというエラーが発生します。

(1) Pythonのコード

 コード01では、7行目の「str1 = 'プログラム終了'」で、変数str1への「値の代入」と「変数の型宣言」が同時に行われています。2行目のiについては分かりにくいですが、変数 i には、range(5)から0~4が代入される時に型宣言もされたことになります。
 また、Pythonでは、コードの途中で変数を再定義できますので、最初は整数を代入し、整数型になった変数に文字列を代入し、str型として再定義することが可能です。

 

#コード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) C言語のコード

 一方、C言語(コード02)では、変数は使用する前に必ず型宣言を行う必要があります。6行目「int i;」では、iをint型と宣言しています。また、コードの途中で変数の型を変更することはできません。この様に変数の型を明確にすることでコーディングのミスを減らすことができますが、柔軟性には欠け、コードも長くなります。

// コード02_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);
}

(3) ExcelのVBAのコード

 Basic(コード03)は、3行目で型宣言を行った変数iは、途中で変数の型を変更することはできません。しかし、必ずしも変数の型宣言を行う必要はなく、例えば12行目のstr1は型宣言を行っていません。なお、型宣言をしなかった場合は、Pythonと同じように、コードの途中で変数に最初とは違う型の値を代入することができます。VBAは、どちらの記述もできることから、最も柔軟性が高いですが、プログラマーの好みでコードの書き方が変わり、他の人がプログラムを見た時に読みにくいともいえます。

'コード03_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

 Pythonはこれらの特徴を持ち、便利な拡張モジュールが豊富なことから、簡潔で読みやすいコーディングを行うことができ、効率よくプログラミングを行うことができます。

4.変数の再定義に要注意

 Pythonは、コーディングをする上では変数や引数の宣言は不要ですが、実際のプログラムの中では、変数の再定義が頻繁に行われています。ここでは詳しく述べませんが、「変数名 = 値」の形で値を代入したときは、変数という箱の中身だけを入れ替えているのではなく、箱ごと取り替えて、再定義し直しています。
 C言語では、型宣言の時にコンピューターのメモリーのどの位置(アドレス)に変数の値を記憶するのかを固定しますが、Pythonでは、例えばa=3の後にa=4を実行すると、a=3の時に記憶していた3は放置し、全く別の場所(アドレス)にa=4を再定義します。

 これは、今は理解する必要はありませんが、「参照渡し」「浅いコピー」「深いコピー」「関数の引数」「クラス」「変数のスコープ」を勉強するようになったときには、理解した方がすっきりします。勉強を進める上で、「変数の受け渡しが、よく分からなくなった・・・」と感じたら、以下の記事を読んでみてください。

参考記事:初心者こそ理解すべき10のエッセンス

1) コンピューターの変数記憶には、参照先のアドレス(id)が使われる。
2) 変更可能体と変更不能体はidに注目。参照渡し、浅いコピーの理解に役立つ。
3) まずは、理屈抜きで覚えよう。「参照渡し」「浅いコピー」「深いコピー」
4) NumPyの「参照渡し」と「コピー」を覚えよう。リストとは全然違う。
5) 関数のスコープは3層入れ子構造(ネスト)の具体例で理解しよう。
6) 「参照渡し後の要素の変更」と「参照渡し後の再定義」の違い
7) 関数に引数で渡された変数の変更が、関数の外側に与える影響。
8) 関数で変なエラーが出た:local variable 'x' referenced before assignment
9) 関数内からグローバル変数を変更したときに関数の外側に与える影響
10) 引数のディフォルト値が変化する場合と変化しない場合の違い