[[山内の演習のページ]]~
訪問者数 &counter();      最終更新 &lastmod();~
#contents

**事前知識 [#za111e01]
-言語の参考文献
--Pythonチュートリアル
--やさしいPython入門
--Pythonスタートブック
--その他多数出版されている
--サイト[[Python入門:http://www.pythonweb.jp/tutorial/]]
--サイト(公式の参照マニュアルの「チュートリアル」部分の翻訳)[[Python チュートリアル:http://www.python.jp/doc/release/tutorial/index.html]] 〜 上の本のWeb版だと思う
--サイト(公式の参照マニュアルの翻訳)[[Python 2.7ja1 documentation:http://www.python.jp/doc/release/]] 〜 正式なよりどころ

**イントロの問題 [#nf803371]
手元にPythonの環境があるとする。絵を描いたりするのを除けば、サーバー上のPythonを起動して使うことができるので、それを前提にする。

***Pythonを起動して簡単な処理をしてみる [#xcea4bad]
-Pythonのインタープリタを起動せよ
--oregano上にTeraTermを使ってログインせよ ⇒ TeraTermのインストール・設定、oregano上のアカウント(IDとPassword)
--Pythonを起動して、プロンプト>>>が出る状態にせよ ⇒ コマンド「python」を打つ
--プロンプト>>>に対して、
 1+3
を入力した後、Enterを打て。何が表示されるか。~
Pythonはインタープリタとして動くので、プログラムを1行入れるとそれだけで動作する。あとで、まとまったプログラムをファイルから与えるやり方を学ぶ。~
--プロンプト>>>に対して、
 x=3.5
 x+2
を入力しEnterを打て。(今後はEnterを省略する)~
ここで気付いてほしいのは、
---xは変数だが、変数の宣言をしていない。Pythonでは、変数は宣言しなくてよい。
---xは浮動小数に当たるが、型を指定していない。Pythonでは、型を指定しなくてよい。
---x+2は型が混在する計算だが、勝手に変換してくれる。気にしなくてよい。
---x+2とだけ打った1行は、「x+2の値を計算して(専門用語では評価して)表示せよ」と解釈される。
--プロンプト>>>に対して、
 y
と入力するとどうなるか。~
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 NameError: name 'y' is not defined
というエラーメッセージが出る。これは、name 'y' is not defined、つまりyなる名前の(変数)がまだ定義されていない(値が設定されていない、というか、中身が何か分からない)というエラーである。
--インタープリタを終了するには、quit()と入力するか、Ctrl-D (Ctrlキーを押しながらDを押す) と押す。

-対話モードではなくて、ファイルに用意したプログラムを実行させるには
--あらかじめ、Pythonのプログラムをファイルに用意する。適当なテキストエディタを使って、ファイルsam1.pyを作れ。ファイル拡張子はpyとするのがよい。内容は
 #! /usr/bin/env python
 # -*- coding: utf-8 -*-
 x = 3
 y = 5
 print(x+y)
とする。先頭の#で始まる2行はおまじないのようなもので、必ず入れておくと良い。ちなみに1行目はこのファイルを(他のスクリプトプログラムと同様に)直接実行させるためのおまじない、2行目はこのプログラムで用いる文字コードがUTF-8であること(感じが出てこない限りは違いが見えないが)を指示している。~
このファイルを実行させるには、Linuxのコマンドプロンプトに対して、
 python sam1.py
とする。結果は
 8
となる。
--ファイルの中に漢字(非ASCII文字)を使いたい場合、そのファイルの文字コードはUTF-8でなければならない。Windowsのメモ帳で作成すると、デフォルトではShif-JISになるので、具合が悪い。~
どういう方法でもよいが、UTF-8にする必要がある。私のお勧めはUTF-8の使える軽いエディタTeraPadであるが、別に他でもよい。更に、oregano上のファイルを編集する時に、WinSCPを使ってリモート側のファイルを「編集」することができるが、その編集のエディタにTeraPadを指定しておくと、なかなか具合よくプログラムが書ける。
---Pythonのコメントは#で始まる行である。コメントに漢字を書くことができる。例えば次のようなファイルを準備し、実行してみよ。
 #! /usr/bin/env python
 # -*- coding: utf-8 -*-
 # これは練習用のプログラムです
 x = 3
 y = 5
 print(x+y)
---Pythonで、漢字を処理したい場合、漢字の文字列定数を書きたくなる。コードを指定しない(ASCIIの)文字列は、引用符(「'」や「"」)で囲む。漢字などの場合は、Unicodeであることを示すために、引用符の前にuを付けて、「u'あいう'」のようにする。次の例を実行してみよ。
 #! /usr/bin/env python
 # -*- coding: utf-8 -*-
 # これは練習用のプログラムです
 s = 'Hallo World'
 print(s)
 t = u'こんにちは'
 print(t)

***ここに出てきたついでに、文字列とprintについて試す~ [#qfb37787]
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!!


///////
**条件判定やループ [#o79ca6a2]
他の言語で学んだと同じように、条件判定(IF文)や、ループ(FOR文、WHILE文など)が使える。それぞれの意味は他の言語と同じである。書き方に少しだけ注意がいる。
-ブロックの替わりに段下げ(インデント)を使う~
JavaやC言語では、if文やfor文の実行部分(ボディの部分)のブロックを示すのに、カッコ「{」と「}」を使うのだが、Pythonではそれの替わりに、段下げを用いる。カッコは使わない。
 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
注意したいのは、~
1. if文とelseの行末にコロン「:」があって、「ここから1段下へ下がるよ」と示していること~
2. JavaやCでは文の終わりにセミコロン「;」があってこれが文と文との切れ目を示していたが、Pythonでは行の終わりがそれに相当することになっていて、セミコロンは書かない。但しどうしても1行に2つ以上文を書きたいときはセミコロンで区切って書いてよい。~
3. Pythonではブロックを示すために段下げが同じに位置であることを使う。だから、同じブロックのつもりでも、段下げ位置が違うと、困る(通常はエラーになる)。~
段下げが元に戻ると、そのブロックが終わりということになる。~
また、段下げの文字数(何文字下げるか)は問題でない。何文字分でも(揃ってさえいれば)いいらしい。
 エラーになる例
 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文のループ制御の書き方は、JavaやC言語と違う。~
JavaやC言語では、
 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]は数のリストである。~
もちろん、これでは10が100になったら書ききれないので、range関数という道具がある。たとえば
 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)を計算してくれる。

//////
**データ構造 [#ga3447c4]
Pythonでは、データの構造は結構重要で、きちんと理解しておく必要がある。といっても、簡単な構造が分かれば大抵は済む。(木などはまず滅多に出てこない)

***リスト型とその操作 [#p5e11d2a]
リスト型は、データを並べたもので、書くときには「コンマで区切られた値から成るリストをカッコで囲む」です。たとえば
 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 リスト型についてもう少し:http://www.python.jp/doc/release/tutorial/datastructures.html]] を参照~
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


***文字列 [#a6abc6ad]


***辞書型 [#ldf2a463]

まずはこのぐらいで、今までJavaで書いていた大抵のプログラムは書けるのではなかろうか?



///////
*ライブラリを使うこと [#b8c00d12]
Pythonのおもしろさは、ライブラリの豊富さにある。これはJavaでもCでも同じなのだが、既存のライブラリを割と簡単に使えるのが受けているように思う。

標準的についてくるライブラリと、どこかから持ってくる(標準ではない)ライブラリがある。その他に自分で作るライブラリもあるが、これは当面サボろう。

**標準ライブラリ [#f08c6d1b]
まずは、[[ドキュメント:http://www.python.jp/doc/release/library/index.html]]を参照。

全部を紹介するわけに行かないので、いくつかおもしろいものを。
*** [#mc468661]
***文字列 [#i3f5dd6a]
2つ話があって、1つ目は[[シーケンス型(組み込み型の1つ)としての文字列の持つメソッドについて:http://www.python.jp/doc/release/library/stdtypes.html#string-methods]]。たとえば、文字列に対して、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つ目は[[さまざまな文字列処理のモジュール:http://www.python.jp/doc/release/library/strings.html]]。 この中でも本格的に使い出すと便利なのが正規表現操作である。 (正規表現でかかれた)パターンマッチwしてくれる。


**関数の定義 [#ob9b2fd1]
Javaのプログラミングで、自分でメソッドやクラスを定義するところまで進んだだろうか? C言語の場合は、結構最初の頃に自分で関数を定義するかもしれない。

***次へ ⇒ [[山内の演習のページ/研究室演習13/Python2]] [#mfcb2b71]
*次へ ⇒ [[山内の演習のページ/研究室演習13/Python2]] [#mfcb2b71]

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