B演習(言語処理系演習) 第1回 田浦 演習HP: http://www.logos.ic.i.utokyo.ac.jp/lectures/enshu2008/ 今日の予定 Pythonの紹介 Mini-Python (課題処理系)の仕様 今週の課題 • • • • 班分け サーバへのログイン, SSH公開鍵認証設定 Subversion Pythonの練習 Pythonの紹介 オブジェクト指向スクリプト言語 • www.python.org • www.python.jp (日本語サイト) • https://sourceforge.jp/projects/pythonjp/files (各種 フォーマットでのマニュアル類) 起動方法 シェルで対話的 ファイルの実行 emacsで対話的 主なデータ型 スカラー: 整数,浮動小数点数,None 関数 文字列 入れ物系: リスト,タプル,辞書 オブジェクト メソッド 主な式 リテラル (1, 3.5, “hello”, etc.) リスト表現,タプル表現,辞書表現 (後述) 算術 (+, *, &, |, etc.) 比較 (<, >, <=, >=, ==, is, etc.) 添え字表記 (a[i]) オブジェクトの属性参照 (a.f) 呼び出し (f(x, y, z)) 主な文(1) 単純文 式文 代入 pass 何もしない del 入れ物から要素を除去 print 式の値の表示 return, break, continue global 後述 import ライブラリの輸入利用宣言 raise 例外発生 主な文(2) 複文 if while for try 関数定義 (def) クラス定義(class) 特徴的事項の説明 入れ物(リスト,タプル,辞書)および文字列 関数定義 for文 字下げ規則および文法の癖 オブジェクト ライブラリの利用 同等性比較 変数のスコープ クラスの定義 文字列・入れ物の文法(1) 文字列 : Cと同じ • 例: “hello” リスト : [ 式, 式, … ] • 例: [] [1] [ 1, 2, 3 ] [ “hello”, 1 ] [ [1,2], [3], 0, “w” ] タプル : (式, 式, …) • 例: () (1, ) (1, 2, 3) (“hello”, 1) ((1, 2), [3], 0, “w”) • 注: (1)はタプルではなく,1と同じ 文字列・入れ物の表記(2) 辞書 : { 式 : 式, 式 : 式, … } • 例 : {} { 0 : “Sunday”, 1 : “Monday” } { “Sunday” : 0, “Monday” : 1 } • いわゆる連想配列 文字列・入れ物の要素参照 E1[E2] (E1, E2は式) • E1 : 入れ物 • E2 : 整数 (E1 が文字列,リスト,タプルの場合) • E2 : hashableな値 (E1 が辞書の場合) • hashableな値 = 辞書やリストを含まない値 • ○ : 1, “hello”, (1, 2, 3) • × : [1, 2], (1, [2, 3]), { “a” : 1 } Syntax sugar : a[(x, y, z)]をa[x, y, z]と略記 文字列の場合の注意 Pythonに「文字型」はなく,「長さ1の文字列」 で代用する 文字の要素を参照すると,長さ1の文字列 • “hello”[2] “l” • “l”[0] “l” 文字列・入れ物の要素書き換え E1[E2] = E3 del E1[E2] 詳しくはチュートリアル参照 辞書およびリストにのみ適用可能 タプル・文字列は変更できない(immutable) 文字列・入れ物の要素数 len(E) Sequenceの連接・繰り返し Sequence = 文字列,リスト,タプル + による連接, * による繰り返し • • • • • “hello” + “ world” “hello world” “ha” * 3 “hahaha” (1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) (1, 2) * 3 (1, 2, 1, 2, 1, 2) リストも同様 辞書に特有の操作 E.keys() : キーのリスト E.values() : 値のリスト E.items() : (キー,値)のリスト よく使うリスト関係の関数 l.append(x) • リスト l の末尾に要素xを加える range(a, b) • リスト [a, a + 1, …, b – 1] を作る • for文(後述)とともに多用される 例: • for i in range(0, n): print i 文字列への値の埋め込み Cのprintfに似ているが違う E1 % E2 “I bought %s” % “car” “I bought car” “I bought %s on %s/%s/%s” % (“car”, 2005, 10, 5) “I bought car on 2005/10/5” 関数定義(def) def f (x, y, …): 文の並び 例: def f (x, y): return x + y 文法規則では,関数定義は通常の文であり, 文の現れるところならどこに現れても良いが, 多くはtoplevelにのみ現れる for文 for x in sequence: 文の並び • sequenceの各要素を順にxにbindして 文の並び を実行 C風に書けば以下の文に対応 S = sequence; n = len(S); for (i = 0; i < n; i++) { x = S[i]; 文の並び } 字下げ規則と文法の癖 Python文法の一貫した特長 • 字下げの深さによってif/for/while/関数定義の終 わりを認識する • 区切りとなるところで “:” (コロン記号)を使う 例1 if x: print x print y print z def f(x): print x print y print z if文のbody if文の外 関数定義のbody 関数定義の外 例2 if x: if y: if z: print 1 else: print 2 このelseに対応するifは? ライブラリの利用 import モジュール名 • モジュールを輸入する(そのモジュールで定義さ れている関数名などにモジュール名.名前アクセ スできるようになる) 例 • import string x = string.atoi(“35”) どのようなモジュールがあるか? ライブラリ リファレンス 頻出モジュール string, sys, os, re, math, random, time ライブラリリファレンス2.1 「組み込み関数」も 参照 socket, select, threading (本格的システムプロ グラミング) オブジェクト Javaのオブジェクトと概念としてはほとんど同 じ 要素へのアクセス: E.フィールド名 メソッド呼び出し: E.メソッド名(E1, E2, …) 注: 辞書やリストなどはオブジェクト • d.keys(), l.append() などはメソッド呼び出し 変数のスコープ規則 (古いPythonおよびmini-Pythonの仕様) ローカル(関数内でのみ有効)とグローバルの 2種類 • トップレベル(関数定義の外)でx = 1 グローバ ル変数xが生まれる • 関数内で x = 1 その呼び出し中にのみ有効な ローカル変数xが生まれる • 他の呼び出し内のx, グローバル変数のxとは別物 • ただしその関数の実行中に,global x という文が 実行されていたらそれはグローバル変数xへの代 入とみなされる 変数の参照 関数の実行中にxへの参照が現れたら • その関数呼び出し内でローカル変数xが生まれて いたらそれを参照 • なければグローバル変数xを参照 • それもなければエラー 例 x = “global” def f(): print x x = “f” print x g() print x def g(): print x x = “g” h() print x def h(): global x x = “h” 注: 新しい(現在の)Pythonの仕様 関数定義の中に関数定義を書ける. 内側の 関数中の変数参照は, 「内側から外側へ」見 ていく規則 def f(x): def g(y): def h(z): return x + y + z return h return g 同等性比較 == 値の比較 is 同一のオブジェクトであるか否かの判定 例 • a = [1, 2, 3] • b = [1, 2, 3] • a == b true • a is b false クラスの定義 class クラス名: メソッド定義1 … メソッド定義n メソッド定義の文法は関数定義と同じ 例 : カウンタ class counter: def __init__(self): self.x = 0 def add(self, dx): self.x = self.x + dx c = counter() c.add(3) /* Javaでは… */ class counter { int x; counter() { x = 0; } void add(int dx) { x += dx } } メソッド定義時の注意 メソッドの第一引数がJavaで言うところの “this” オブジェクト(Pythonの慣習では “self” という変数名を使うが,名前は自由) メソッド内で自分のフィールドやメソッドを使う 際も,self.f, self.m(x, y, z)のように,オブジェ クトへの参照を明示的に書く コンストラクタ : __init__ という名前のメソッド として定義する
© Copyright 2024 ExpyDoc