ppt

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__ という名前のメソッド
として定義する
