![]() |
![]() |
![]() |
Python は人気になりつつある言語で、優れた紹介記事が Web 上にたくさんあります。 その中でも、日本 Python ユーザ会は 優れたサイトです。ここから、各種マニュアルの日本語訳がダウンロードできます。 この解説記事は、実は、日本 Python ユーザ会が翻訳したマニュアルへのリンク集です。 リンクを張れるという HTML の特徴を生かせば、無理なく、トップダウン方式の解説を書くことが出来ます。
ちなみにここで、ボトムアップというのは個々の部品を作ってから全体を作るという意味です。 会社などの組織で下層の要員の発案でプロジェクトを起こすという意味ではありません。 同様に、トップダウンを言うのは見取り図を示してから段々と細かい話に入るという意味です。 会社などの組織でトップの発案でプロジェクトを起こすという意味ではありません。 念のため。
python option script argvs
と打ち込むと起動します。"python" とだけ、打ち込むと対話モードに入り ">>>" というプロンプトが
表示されます。対話モードは個々の関数をテストするのに便利です。
起動オプションは以下の通りです。オプション | 効果 |
---|---|
-d | デバック情報を出力する。 |
-i | スクリプトを対話的に検査し、プロンプトを出力する。 |
-O | 生成するバイトコードを最適化する。 |
-S | import 文を無視する。 |
-t | 矛盾したインデント付けを警告する。 |
-u | バッファ無しのバイナリー標準出力と標準エラー出力 |
-U | 文字列リテラルを Unicode として読む |
-v | 詳細な import 文の追跡 |
-x | ソースの最初の行をスキップ。 |
-? | ヘルプ |
スタートアップファイルの例:
01: # PYTHONSTARTUP 02: 03: import sys, math, re, os, os.path 04: print 'sys, math, re, os, os.path has been imported.'
00: #! /usr/bin/env python 01: # -*- coding: shift_jis -*- 02: 03: r""" 04: スクリプトについての説明 05: 説明1: 06: 説明2: 07: """ 08: import string 09: from datetime import date 10: import tkinter as tk 11: 12: #function 13: def sum(ls): 14: """ リストの要素の合計を求める""" 15: s=0 16: for x in ls: 17: s+=x 18: return s 19: 20: class MyClass: 21: """私のクラス""" 22: def __init__(self, p1, p2): 23: self.p1 = p1 24: self.p2 = p2 25: 26: def show_p1(self): 27: return self.p1 28: 29: def show_p2(self): 30: return self.p2 31: 32: if __name__ == '__main__': 33: print sum([x*x for x in range(10)]行
import os.path as path import Tkinter as tk
対話モードで、import(script) を使って読み込まれたときには 33 行目は実行されないので、 個々の関数を別個にテストするのに便利です。
Python の代入は基本的に C 言語と同じで、'=' の右側の値を左側に代入します。 C 言語と違うところは、代入文は値を返さないところです。従って、C 言語風に次のようには書けません。
c=1 if 0==(a=c): print 'a = 0' else: print 'a = 1'また、Python は複数の代入を同時に行うことができます。これはとてもクールです。2番目のように構造化代入もできます。
a, b, c = 1, 2, 3 (a, (b, c)) = (10, (20, 30))
if test: then_block elif test_elif: elif_block else: else_block
while test: body_block if break_test: break if continue_test: continue else: else_block
for x in iterator: body_block if break_test: break if continue_test: continue else: else_block
>>> for x in xrange(10): print x, ', ', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
>>> s='abc' >>> for i, c in enumerate(s): print i, ':', c, ' ', 0 : a 1 : b 2 : c
for line in _file:
..............
>>> days = {'sun':0, 'mon':1, 'tue':2, 'wed':3, 'thu':4, 'fri':5, 'sat':6} >>> for k, v in days.iteritems(): print k, ':', v, ' ', wed : 3 sun : 0 thu : 4 tue : 2 mon : 1 fri : 5 sat : 6
>>> questions = ['name', 'quest', 'favorite color'] >>> answers = ['lancelot', 'the holy grail', 'blue'] >>> for q, a in zip(questions, answers): ... print 'What is your %s? It is %s.' % (q, a) ... What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue.
# ls のうち、正の要素について平方根を計算しそのリストを返す。 ls = [1, 2, -3, -4] # 通常のループ def foo1 (ls): ls1=[] for x in ls: if x > 0: ls1.append(math.sqrt(x)) return ls1 # 内包表現 def foo2 (ls): return [ math.sqrt(x) for x in ls if x > 0]
# 九九を返す。 # 通常のループ def bar1 (): ls1=[] for x in range(2,10): for y in range(2,10): ls1.append(x*y) return ls1 # 内包表現 def bar2 (): return [x * y for x in range(2,10) for y in range(2,10)]
try: try_block except ??Error: exept_block else: else_block finally: finally_blockまず、try_block を実行し、もし、例外が発生すれば、 exept_block を実行します。例外の種類別に複数の exept_block を書くことができます。例外が発生しなければ else_block を実行します。 else_block は省略可能です。
finally_block は例外発生の有無にかかわらず 必ず実行されます。LISP の unwind-protect に似ています。finally_block は省略可能です。
また、__enter__ と __exit__ メソッドが定義されているクラスのインスタンスを 生成する場合は with ステートメントを用いることもできます。 詳しくは、Python 2.5 の新機能をみてください。
print >> file_handle, value1, value2, ....
def sum(ls):
""" リストの要素の合計を求める"""
s=0
for x in ls:
s+=x
return s
>>>sum([1,2,3]) 6
import sys def my_xrange(*parms): lp = len(parms) if not 0 <= lp <= 3: print >> sys.stderr, "Wrong argument count." if(lp==0): i = 0 while True: yield i i += 1 else: i, n, s = (lp==1 and (0, parms[0], 1)) or \ (lp==2 and (parms[0], parms[1], 1)) or \ (parms[0], parms[1], parms[2]) if(s==0): print >> sys.stderr, "Step width shuld be non-zero." elif(s > 0): while(i < n): yield i i+=s else: while(i > n): yield i i+=s
例:
lambda x,y: x+y # 足し算 lambda x,y: x*y # 掛け算
また、Python 2.2 以降では、組み込みデータ型を親クラスにできるようになりました。 それを使ったベクトルクラスは Python の "新しい" クラス にあります。(そちらのほうが実用的です。)
#! /usr/bin/env python # coding: shift_jis import sys, math def sum(ls): """リストの要素を合計します。""" s=0 for x in ls: s+=x return(s) class Vector: """ Vector はベクトル演算のためのクラスです。 """ def __init__(self, *rest, **key): """ ベクトルを初期化します。 要素が渡されたら、その要素からなるベクトルを作ります。 v1 = Vector(1,2,3) 次元と初期値が渡されたら初期値 val, 次元 dim のベクトルを作ります。 val が省略されると初期値は 0 になります。 v1 = Vector(dim=3, val=3) """ if rest: self.v = list(rest) else: dim = key['dim'] val = (('val' in key) and key['val']) or 0 self.v = [val for x in range(dim)] def __len__(self): """ベクトルの次元を返します。""" return len(self.v) def abs(self): """ベクトルの絶対値を返します。""" return math.sqrt(sum([ x * x for x in self.v ])) def norm(self): """規格化されたベクトルを返します。""" a = self.abs() b = Vector(dim=len(self)) b.v = [x/a for x in self.v] return b def __add__(self, a): """ベクトルと実数、またはベクトル間の足し算をします。""" b = Vector(dim=len(self)) if isinstance(a, Vector): if len(self) != len(a): print >> sys.stderr, "Dimension Error" else: b.v = [ x + y for x, y in zip(self.v, a.v)] else: b.v = [ x + a for x in self.v] return b def __mul__(self, m): """ベクトルと実数、またはベクトル間の掛け算(内積)をします。""" if isinstance(m, Vector): if len(self) != len(m): print >> sys.stderr, "Dimension Error" else: return sum([ x * y for x, y in zip(self.v, m.v)]) else: b = Vector(dim=len(self)) b.v = [ x * m for x in self.v] return b def __repr__(self): """表示するときの文字列を定義します。""" return '#V' + `self.v` __str__ = __repr__
class class_name(*super_classes): .......で行います。スーパークラスがあれば、それを引数に与えます。多重継承もありです。
# 要素を明示的に与える >>>v1 = Vector(1,2,3) # 次元と初期値を与える >>>v2 = Vector(dim=3, val=0)
>>>v = Vector(1,2,3) # 長さの計算 >>>v.abs() 3.7416573867739413 # 規格化する >>>v.norm() #V[0.2672612419124244, 0.53452248382484879, 0.80178372573727319]
>>> v1=Vector(1,2,3) >>> v2=Vector(dim=3, val=2) >>> v1+10 #V[11, 12, 13] >>> v1+v2 #V[3, 4, 5] >>> v1*100 #V[100, 200, 300] >>> v1*v2 12
演算 | 結果 |
---|---|
x in s |
s のある要素 x と等しい場合 True 、そうでない場合 False |
s + t |
s および t の結合 |
s * n , n * s |
s の浅いコピー n 個からなる結合 |
s[i] |
s の 0 から数えて i 番目の要素 |
s[i:j] |
s の i 番目から j 番目までのスライス |
s[i:j:k] |
s の i 番目から j 番目まで、k 毎のスライス |
len(s) |
s の長さ |
min(s) |
s の最小の要素 |
max(s) |
s の最大の要素 |
# 例 >>> s='abcde' >>> s[-1] # インデックス -1 は最後の要素 'e' >>> s[1:] # 最初の要素を除く 'bcde' >>> s[:-1] # 最後の要素を除く 'abcd' >>> s*2 'abcdeabcde' >>> min(s) 'a' >>> max(s) 'e' >>> s[0:-1:2] 'ac'
s = 'abcdefg' # 不可、文字を直接代入できない。 s[0]='z' # 次のようにして全体を作り直す必要がある。 s = 'z' + s[1:]
Memo:
文字列 line から末尾の改行文字を取り除くには、
line = line.rstrip('\n')
# あるいは、
import string
line = string.rstrip(line, '\n')
とします。ファイルから1行ずつ読み込むときよく使います。
>>>'%d:%d' % (1, 2) '1:2' >>>'%(month)s %(date)d, %(year)4d' % {'year':2005, 'month':'February', 'date':3} 'February 3, 2005'
>>> ls=[1,2,3] >>> ls[0]=100 >>> ls [100, 2, 3] >>> ls2=[ls, 10,20,30] >>> ls2 [[100, 2, 3], 10, 20, 30]リストの操作については ライブラリリファレンス 2.3.6.4 を見てください。
Memo:
>>>ls = [] >>>ls.append(1) >>>ls [1]
例:
>>> ls=[1024, 339, 27, 890, 466, 228] >>> ls1=ls >>> ls1.sort() # 普通に昇順にソート >>> ls1 [27, 228, 339, 466, 890, 1024] # リストが破壊的に書き換えられる。 >>> ls2=ls >>> ls2.sort(lambda x,y: cmp(x%100, y%100)) # 下2桁が小さい順にソート >>> ls2 [1024, 27, 228, 339, 466, 890]
詳しくは チュートリアル 5.3. を見てください。
>>>days = {'sun':0, 'mon':1, 'tue':2, 'wed':3, 'thu':4, 'fri':5, 'sat':6} # 初期化 >>>'sun' in days # 存在するか? True >>>month={} >>>month['jan'] = 1 # 代入 >>>month['jan'] += 1 >>>month['jan'] 2 >>>del month['jan'] # 削除詳しくは ライブラリリファレンス 2.3.7. を見てください。
value = then_value if predicate else else_valuepredicate が真なら、then_value が、偽なら else_value が value に代入されます。
# fileinput を使わないと for fname in sys.argv[1:]: f=file(fname) for line in f: (do something with line) f.close() # fileinput を使うと import fileinput for line in fileinput.input(): (do something with line)詳しくは ライブラリリファレンス 5.15 を見てください。
例、HTML ファイルからリンクを取り出す。
#! /usr/bin/env python # coding: shift_jis """ 引数で与えられたファイルを検索してリンクをを探し、 それを rink.txt に書き出す。 """ import sys RINK = 'rink.txt' A_HREF = re.compile("<a href ?= ?\"http://([^\"]+)\">([^<]+)</a>", re.S) #main if __name__=='__main__': rink_hash={} for fname in sys.argv[1:]: f=file(fname, 'r') for m in A_HREF.finditer(f.read()): rink_hash[m.group(1)] = m.group(2) f.close() fout = file(RINK, 'w') for address, name in rink_hash.iteritems(): fout.write("<li> <a href = \"http://%s\">%s</a>\n" % (address, name)) fout.close()
>>> datetime.date.today().isoformat() '2005-02-02' >>> datetime.datetime.now().isoformat() '2005-02-02T17:50:09.867000'
>>> datetime.datetime.now().strftime('%y-%m-%d: %H:%M:%S') '05-02-02: 23:20:12' >>> datetime.date.today().strftime('%y-%m-%d') '05-02-02'
>>> import operator as op
>>> reduce(op.add, [1,2,3,4,5]) # 1+2+3+4+5
15
詳しくは、
ライブラリリファレンス 3.10. operator -- 関数形式の標準演算子を見てください。
モジュール | 演算子、関数 | 機能 (True でない場合は False) |
---|---|---|
組み込み | == | 左辺と右辺が等しければ True。 |
組み込み | != | 左辺と右辺が等しくなければ True。 |
組み込み | < | 左辺が右辺より小さければ True。 文字列にも使える。例: 'abc' < 'ab' &rArr False |
組み込み | > | 左辺が右辺より大きければ True。 文字列にも使える。 |
組み込み | <= | 左辺が右辺より小さいか、左辺と右辺が等しければ True。 文字列にも使える。 |
組み込み | >= | 左辺が右辺より大きいか、左辺と右辺が等しければ True。 文字列にも使える。 |
組み込み | in | 左辺が右辺に含まれていれば True。
例: リスト: 1 in [1,2,3] &rArr True 文字列: 'ab' in 'abc' &rArr True 辞書: 'mon' in {'sun':0, 'mon':1, 'tue':2, 'wed':3} &rArr True |
組み込み | is | 左辺と右辺が等しオブジェクトならば True。 ls1 = [1,2,3] ls2 = [1,2,3] ls3 = ls1 ls1 is ls2 &rArr False ls1 is ls3 &rArr True |
組み込み | isinstance( object, classinfo) | 引数 object が引数 classinfo のインスタンスであるか、 (直接または間接的な) サブクラスのインスタンスの場合 True。 |
組み込み | issubclass( class, classinfo) | class が classinfo の (直接または間接的な) サブクラスである場合に True。 |
文字列メソッド | isalnum() | 文字列中の全ての文字が英数文字 [a-zA-Z0-9] で、かつ 1 文字以上ある場合 True。 |
文字列メソッド | isalpha() | 文字列中の全ての文字が英文字 [a-zA-Z] で、かつ 1 文字以上ある場合 True。 |
文字列メソッド | isdigit() | 文字列中に数字しかない場合 True。 |
文字列メソッド | islower() | 文字列中の大小文字の区別のある文字全てが小文字で、かつ 1 文字以上ある場合 True。 |
文字列メソッド | isspace() | 文字列が空白文字だけからなり、かつ 1 文字以上ある場合 True。 |
文字列メソッド | istitle() | 文字列がタイトルケース文字列であり、かつ 1 文字以上ある場合、 すなわち大文字は大小文字の区別のない文字の後にのみ続き、 小文字は大小文字の区別のある文字の後ろにのみ続く場合 True。 |
文字列メソッド | isupper() | 文字列中の大小文字の区別のある文字全てが大文字で、かつ 1 文字以上ある場合 True。 |
os.path | exists(path) | path が存在する場合 True。 |
os.path | isfile(path) | path が存在する正しいファイルの場合 True。 |
os.path | isdir(path) | path がディレクトリの場合 True。 |
fileinput | isfirstline() | 最後に読み込まれた行がファイルの1行目なら True。 |
fileinput | isstdin() | 最後に読み込まれた行がsys.stdinから読まれていれば True。 |
![]() |
![]() |
![]() |