[[ノート/Python]]~
訪問者数 &counter();      最終更新 &lastmod();

#contents



*Python入門 〜 Java既習者のPython入門 [#gb5d33c6]
Javaプログラミングを既にある程度ならった人が、Pythonを学ぶポイント。


**違い1 〜 ブロックの入れ子は段下げ(インデント)で表現 [#k58d34e5]
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 〜 型宣言なし [#x71f8fef]
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のインタープリタが自動的に変数を作り、必要な型を当てはめる。 見かけ上は全く気にしなくて良い。

変数宣言が不要というのは、一見すると便利であるが、それなりの問題を起こすことがあるのでそのことは知っておく必要がある。
-第1に、プログラムを書いている際に変数名を綴り間違えると、異なる変数と見なされる。たとえば最初にbelieveという変数を使い、後にbeleiveと綴ると、両社は異なる変数と見なされるし、それに対する「警告」はしない。JavaやC言語の場合は綴り間違えると「そんな変数は宣言されていないぞ」というエラーメッセージが出るのに対して、Pythonの場合はそのことは特に問題にされない。ただ、運がよいと、後から使った変数beleiveについて「その変数は何も書き込んでいない(初期化していない)のに値を読みだしているよ」というメッセージが出るので、気が付く。このメッセージが出るかどうかは、変数の使い方のパターン次第なので、必ずこれで検出されるというわけではなく、当てにはならない。

-第2に、型は、基本的に都合の良いように自動変換してくれるので、たいていは困らないのだが、時に意図に反することがあるので注意をする必要がある。まずうまく行く例として
 x = 1.0  // 変数xを1.0とする。 この結果xは浮動小数型になっている
 x + 2    // xに整数2を足した。 でも、xに合わせて浮動小数に変換して計算する
 3.0      // だから、整数3ではなくて浮動小数3.0になる
また、
 x = 1.0  // 変数xを1.0とする。(浮動小数型)
 x = 2    // 変数xを2とする。(無理やりxに整数2を代入した)
 x        // xの中身を見てみると
 2        // ちゃんと整数になっている
であるが、自動変換はこの辺りまでが限度で、
 x = 'a'  // 変数xを文字型の'a'にする
 x + 1.0  // そのxに浮動小数1.0を加える
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 TypeError: cannot concatenate 'str' and 'float' objects
最後のエラーメッセージの意味は、文字型(xの値である'a'のこと)とfloat(1.0のこと)をconcatenate(文字同士の結合・連結)することはできない、と言っている。つまり、ここの「+」演算子は数の足し算ではなくて、(演算子の第1引数である)文字型に対する「+」演算(=文字列の結合演算)だと判断し、第2引数の1.0が文字(列)でないぞ、と文句を言っているわけである。~
この辺になると、Pythonの中でどう「型」が扱われるか想像できないとエラーメッセージの意味が理解できない、ということにも繋がるだろう。


**違い3 〜 for文の繰り返し指定は、inやらrangeやらを使う [#eae0a5c8]
もう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 までのリストが作られるので、
 for i in range(0, 5):
    print i
とすれば
 0
 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 〜 オブジェクト指向 [#xeb44e77]
PythonもJavaもオブジェクト指向の機能を持った言語です。C言語はオブジェクト指向には対応しておらず、その後に作られた C++ で初めてオブジェクト指向が使えます。

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



**違い5 〜 入出力 [#lae001fc]

**違い6 〜 リストを使う [#w553e020]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS