![]() |
山内の演習のページ/研究室演習13/Pythonhttp://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%BB%B3%C6%E2%A4%CE%B1%E9%BD%AC%A4%CE%A5%DA%A1%BC%A5%B8%2F%B8%A6%B5%E6%BC%BC%B1%E9%BD%AC13%2FPython |
![]() |
山内の演習のページ
訪問者数 1871 最終更新 2012-11-07 (水) 09:23:00
手元にPythonの環境があるとする。絵を描いたりするのを除けば、サーバー上のPythonを起動して使うことができるので、それを前提にする。
1+3を入力した後、Enterを打て。何が表示されるか。
x=3.5 x+2を入力しEnterを打て。(今後はEnterを省略する)
yと入力するとどうなるか。
Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'y' is not definedというエラーメッセージが出る。これは、name 'y' is not defined、つまりyなる名前の(変数)がまだ定義されていない(値が設定されていない、というか、中身が何か分からない)というエラーである。
#! /usr/bin/env python # -*- coding: utf-8 -*- x = 3 y = 5 print(x+y)とする。先頭の#で始まる2行はおまじないのようなもので、必ず入れておくと良い。ちなみに1行目はこのファイルを(他のスクリプトプログラムと同様に)直接実行させるためのおまじない、2行目はこのプログラムで用いる文字コードがUTF-8であること(感じが出てこない限りは違いが見えないが)を指示している。
python sam1.pyとする。結果は
8となる。
#! /usr/bin/env python # -*- coding: utf-8 -*- # これは練習用のプログラムです x = 3 y = 5 print(x+y)
#! /usr/bin/env python # -*- coding: utf-8 -*- # これは練習用のプログラムです s = 'Hallo World' print(s) t = u'こんにちは' print(t)
print関数は、引数として渡す変数屋敷の値をプリントする。上で試した通りである。
#! /usr/bin/env python # -*- coding: utf-8 -*- print('Hallo') print(3) s = 'Hallo World' print(s) x = 5 y = 3 print(x+y)
また、文字列をくっつけるなどの操作が役立つときがある。文字列を結合するには演算子+を使う。
#! /usr/bin/env python # -*- coding: utf-8 -*- s1 = 'Hallo' s2 = 'World' t = s1 + s2 print(t) print(t + '!!')
結合演算は自動的に空白を入れたりはしないので、文字列がくっついてしまった。
HalloWorld HalloWorld!!
他の言語で学んだと同じように、条件判定(IF文)や、ループ(FOR文、WHILE文など)が使える。それぞれの意味は他の言語と同じである。書き方に少しだけ注意がいる。
Javaの例 if (x>0) { x = x + 100; y = 0; } else { x = -x; y = -1; }これに対して
Pythonの例 if (x>0): x = x + 100 y = 0 else: x = -x y = -1注意したいのは、
エラーになる例 if (x>0): x = x + 100 y = 0 else: x = -x y = -1は
y = 0 ^ IndentationError: unexpected indentというエラーが出る。また、下の例のようにifの中とelseの中で、段下げの量が違ってもよいらしい。
if (x>0): x = x + 100 y = 0 else: x = -x y = -1最後に、段下げの空白文字は、英数半角の空白を使うこと。全角文字の空白は段下げに見なされないし、そこに「 」という漢字文字があると認識されてしまう。
for (x=0; x<10; x++) { y = f(x); }のように書いたが、Pythonでの考え方は、変数xがなめてゆく「リスト」(正確には「シーケンス」)を与える。たとえば上の例では、
for x in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: y = f(x)とする。[0, 1, 2, ..., 9]は数のリストである。
range(10)と書くと、[0, 1, 2, ..., 9]を返してくれる。初期値を変えたり増分を変えたりすることもできて、
>>> range(5, 10) [5, 6, 7, 8, 9] >>> range(0, 10, 3) [0, 3, 6, 9] >>> range(-10, -100, -30) [-10, -40, -70]のようになる。つまり
for x in range(-10, -100, -30): y = f(x)のように書くと、ループを回るごとにf(-10), f(-40), f(-70)を計算してくれる。
Pythonでは、データの構造は結構重要で、きちんと理解しておく必要がある。といっても、簡単な構造が分かれば大抵は済む。(木などはまず滅多に出てこない)
リスト型は、データを並べたもので、書くときには「コンマで区切られた値から成るリストをカッコで囲む」です。たとえば
a = [1, 2, 3] b = ['apple', 'orange', 'grapefruit'] c = ['spam', 'eggs', 100, 1234]
最後の例cでは、同じ型ではないデータが並んでいることに注意。
リストの要素は、単独の時は、何番目というインデックスで示される。但しインデックスは0から始まる。つまり、上記の例bでは、b[0]は'apple'、b[1]は'orange'、b[2]は'grapefruit'である。
範囲で示すこともでき、スライスと呼ばれる。この時の位置指定は、かなり分かりにくいので注意を要する。「何番目」というよりは、インデックスは≪要素と要素の間の位置≫を示す。図示すると、
[<インデックス=0> <第0要素> <インデックス=1> <第1要素> <インデックス=2> <第2要素> <インデックス=3> <第3要素> <インデックス=4> <第4要素> <インデックス=5>]
のようになっている。だから
b[0:1] ⇒ ['apple']
指定せず、というのも許される。
b[:1] ⇒ b[0:1]と同じで、['apple'] b[2:] ⇒ b[2:3]と同じで、['grapefruit']
マイナスの指定は後ろから逆方向に数えた番目と解釈される。たとえば
b[-1] ⇒ 最後の要素である['grapefruit'] b[-3:-1] ⇒ ['orange', 'grapefruit']
要素の数を求める関数は、len(リスト)である。上記の例であれば
len(b) ⇒ 3
「リストのリスト」もよい。
p = [2, 3] q = [1, p, 4] len(q) ⇒ 3 q[1] ⇒ [2, 3] q[1][0] ⇒ [2]
リスト型に対するいくつかのメソッドがある。
5.1 リスト型についてもう少し を参照
sortなんてのは、結構使える。
外見から見るとリストとほとんど変わらない「タプル」がある。タプルは
a = (1, 2, 'hallo')
のように丸かっこで書かれる。殆ど同じようなことができる
a[1] ⇒ 2 a[:1] ⇒ (1, 2)
が、要素単位に書き込むことができない。
a[1] = 9 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
まずはこのぐらいで、今までJavaで書いていた大抵のプログラムは書けるのではなかろうか?
Pythonのおもしろさは、ライブラリの豊富さにある。これはJavaでもCでも同じなのだが、既存のライブラリを割と簡単に使えるのが受けているように思う。
標準的についてくるライブラリと、どこかから持ってくる(標準ではない)ライブラリがある。その他に自分で作るライブラリもあるが、これは当面サボろう。
まずは、ドキュメントを参照。
全部を紹介するわけに行かないので、いくつかおもしろいものを。
2つ話があって、1つ目はシーケンス型(組み込み型の1つ)としての文字列の持つメソッドについて。たとえば、文字列に対して、replaceメソッドは文字列の置換をする。
a = 'This is a pen.' b = a.replace('i', '*') print(b)
また、lstrip・rstripや、find・rfind、partition・rpartitionなどは便利。
なお、大抵は全角文字(漢字)でもうまくいく。
a = '今日はJimとBillとに会った.' b = a.replace('今日は', 'おととい') print(b)
2つ目はさまざまな文字列処理のモジュール。 この中でも本格的に使い出すと便利なのが正規表現操作である。 (正規表現でかかれた)パターンマッチwしてくれる。
Javaのプログラミングで、自分でメソッドやクラスを定義するところまで進んだだろうか? C言語の場合は、結構最初の頃に自分で関数を定義するかもしれない。