ノート/Python
訪問者数 658      最終更新 2012-12-26 (水) 14:13:31

Python入門 〜 Java既習者のPython入門

Javaプログラミングを既にある程度ならった人が、Pythonを学ぶポイント。

違い1 〜 ブロックの入れ子は段下げ(インデント)で表現

Javaでも「段下げをしなさい」と言われることはあるが、ブロックの入れ子状態は{ }で囲むので、実は段下げに関係なくコンパイルする。

if (x>0) {
  x = x + 1;
} else {
  x = x - 1;
}

これに反して、Pythonでは、カッコ { } を使わず、その代わりに段下げによってブロックの入れ子関係を表現する。

if (x>0):
   x = x + 1
else:
   x = x - 1

ここで2つの追加あり。1つは、if のようにブロックに入る文の場合(複合文)入るところにコロン「:」を置くこと。

if (x>0):

とか

else:

とか、後はfor文やwhile文など。

もう1つの追加は、文の終わりもしくは区切りのセミコロン「;」が無いこと。その代わりに改行する。つまり原則は1行に1文だけ。どうしても複数の文を置きたいときは、セミコロン「;」で区切って複数の文を1行に書いてもよいのだが、例外的に使うのがよかろう。

x = x + 1
y = y - 1

としても

x = x + 1; y = y - 1

としても同じ。

違い2 〜 型宣言なし

Java言語やC言語では、変数を使う前に宣言する必要があって、その時に「変数名」と「型」を宣言する。

これはコンピュータ内にその変数名で識別されるメモリ領域を確保すると同時に、その変数に対する演算(代入を含めて)をその「型」で行うことを指示している。具体的にいうと、整数型(int型)は、CPU上での整数としての演算をすることを指定しており、たとえばIntelのCore 3i/5i/7iやPentiumなどのいわゆるx86アーキテクチャのCPUであれば、符号付32ビットの整数演算の命令を使って計算する。またメモリ上の変数領域にロード・ストアする時も、32ビット(4バイト)単位でのロード・ストア命令を使う。また、同じ整数でも符号付き16ビットのshort型、符号付き8ビットのchar型などが宣言できるし、それぞれに対して符号なしの整数、unsigned int, unsigned short, unsigned charなどを宣言することもできる。コンパイル時にはそれぞれの型に応じたCPU上の演算命令を対応させることになる。 同様に、浮動小数点表現をする小数についても、CPUで用意されている単精度浮動小数(32ビット、内容は符号1ビット、指数部8ビット、仮数部23ビット)をfloat型とし、倍精度浮動小数(64ビット、内容は符号1ビット、指数部11ビット、仮数部52ビット)をdouble型とする。(注: 浮動小数の表現はCPU機種に依らず、IEEEの標準規格として決まっている。)

これに反して、Pythonではプログラム上で変数を宣言することをしないし、だから型についても宣言しない。Pythonのインタープリタが自動的に変数を作り、必要な型を当てはめる。 見かけ上は全く気にしなくて良い。

変数宣言が不要というのは、一見すると便利であるが、それなりの問題を起こすことがあるのでそのことは知っておく必要がある。

違い3 〜 for文の繰り返し指定は、inやらrangeやらを使う

もう1つ、Java言語やC言語と大きく違う点に、forループの指定の仕方がある。その前に断っておくが、条件分岐やループの構造の記述は、Pythonも、JavaやCと同じようにif文(if ... else ... を含む)、for文、while文を使う。更にif文の書き方やwhile文の書き方も、「{ }」の代わりに段下げと「:」を使うことを除けば、まあ同じと思ってよいだろう。

if (x > 0){             if (x > 0):
   y = y + 1;              y = y + 1
} else {                else:
   y = y - 1;              y = y - 1
}
while (x > 0) {         while (x > 0):
   x = x -1;               x = x - 1
}

それに比べて、for文の繰り返しの指定の書き方は大きく異なる。pythonでは、繰り返しを制御する変数がリストの要素を先頭から順に拾ってゆき、最後まで到達したら終わる。たとえばリスト [1, 5, 11, 3] の上を変数 i が順に拾ってゆくとすると、

for i in [1, 5, 11, 3]:
   print i

というように書く。JavaやCではよく、0からN-1まで順に拾う、といったパターンがあるが、この場合はリスト [0, 1, 2, 3, ..., N-1] を作ってやる必要がある。それを作る関数として、range([start,] stop[, step]) が用意されているので、これを使う。 rangeを確認すると

print range(1,5)
[1, 2, 3, 4]

のように 1 から( 5 ではなくて) 4 までのリストが作られるので、これを使ってJavaやC言語で見たforループを作ることができる。

for (i=0; i<5; i++) {        for i in range(0, 5):
   System.out.println(i);       print i
}

違い4 〜 オブジェクト指向

PythonもJavaもオブジェクト指向の機能を持った言語です。C言語はオブジェクト指向には対応しておらず、その後に作られた C++ で初めてオブジェクト指向が使えます。

簡単なプログラムを書いている時は、あまりオブジェクト指向を意識しないのですが、ちょっと複雑なデータ構造を扱うと、オブジェクト指向の考え方が出て来ます。

違い5 〜 入出力

違い6 〜 リストを使う


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-26 (水) 14:13:31 (1733d)