![]() |
ノート/Python入門1http://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FPython%C6%FE%CC%E71 |
![]() |
ノート/Python
訪問者数 1300 最終更新 2012-12-26 (水) 14:13:31
Javaプログラミングを既にある程度ならった人が、Pythonを学ぶポイント。
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
としても同じ。
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のインタープリタが自動的に変数を作り、必要な型を当てはめる。 見かけ上は全く気にしなくて良い。
変数宣言が不要というのは、一見すると便利であるが、それなりの問題を起こすことがあるのでそのことは知っておく必要がある。
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が文字(列)でないぞ、と文句を言っているわけである。
もう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 }
PythonもJavaもオブジェクト指向の機能を持った言語です。C言語はオブジェクト指向には対応しておらず、その後に作られた C++ で初めてオブジェクト指向が使えます。
簡単なプログラムを書いている時は、あまりオブジェクト指向を意識しないのですが、ちょっと複雑なデータ構造を扱うと、オブジェクト指向の考え方が出て来ます。