Python クイックリファレンス
文
- 文(statement)
- 命令を実行する単位
- 式(expression)
- 値、演算や関数
- assert
- デバッグ用
- 代入(assignment)
- =などによる代入
- pass
- 何も実行しない文
- del
- オブジェクトの削除
- print
- 式を評価した結果を標準出力に出力
最後に , を付けると改行されない
- return
- 値を返して関数を抜ける
- yield
- ジェネレータ関数で使用
- raise
- 例外を送出
- break
- ループの終了
- continue
- ループの最初に戻ってループを継続
- import
- モジュールの読み込み
- future
- 将来有効なモジュールの読み込み
- global
- 変数をグローバル変数として扱う
- exec
- 動的な実行
- with
- __entr__(), __exit__()が定義されているオブジェクトに使用可能
コメント
- #コメント
- #から改行までがコメント
- '''コメント'''
- """コメント"""
- 複数行コメント
実際は文字列だが、コメントの代わりとして使用する。
型
- True, False
- 真理値
- None
- 何も表さない型
- 整数
- 小数点または指数部のつかない数値
- 2進数
- 先頭に0bをつけた0または1の並び
- 8進数
- 先頭に0oをつけた0..7の並び
- 16進数
- 先頭に0xをつけた0..9,a-fの並び
- 実数
- 小数点または指数部のついた数値
- 複素数
- 実数部と虚数部のついた数値
1+5j, 2.5+3.1j, など
- inf
- 無限大
>>> inf = float('inf')
>>> inf
inf
>>> inf + 1
inf
>>> inf - 1
inf
>>> inf == inf * 2
True
>>> inf - inf
nan
>>> inf * 0
nan
- nan
- 不定
>>> nan = float('nan')
>>> nan == nan
False
>>> nan != nan
True
>>> import math
>>> math.isnan(nan)
True
- 文字列
-
- 'string'
- ' で囲った文字
- "string"
- " で囲った文字
- """string"""
- """ または ''' で囲った文字(改行を含めることができる)
- r'string' または r"string"
- 入力そのままの文字になるraw文字列
- u'string' または u"string"
- ユニコード文字列
- b'string' または b"string"
- byte文字列
エスケープシーケンス
文字列の中で特殊な意味を持つもの。
- \n
- 改行
- \r
- 改行
- \t
- タブ
- \f
- 改ページ
- \'
- シングルクォート
- \"
- ダブルクォート
- \\
- バックスラッシュ
- \x
- 8ビット文字
- \u
- 16ビット文字
- \0
- ヌル文字
変数
- 変数名は英数字と_ ( アンダースコアー )
- 大文字小文字の区別有り
- 変数宣言は無し
- 変数宣言は無くても、型はある
- 変数は、代入されたときと、関数の引数で定義されたときに作られる
- 変数のスコープは、作られた場所のインデントによって決まる
val = 0 # 外部変数
def test1():
val = 1 # 局所変数
val1 = val # 局所変数valの値1をval1に代入
def test2():
val2 = val # 外部変数valの値をval2に代入
def test3():
global val
val = 2 # 外部変数valに2を代入
- アンパック代入
リスト•タプルを展開して複数の変数に代入する
>>> a,b,c = [1, (2, 3), 4]
>>> print a
1
>>> print b
(2, 3)
>>> print c
4
>>> x = 2
>>> y = 3
>>> y, x = x, y
>>> print x, y
3 2
>>> def test((x, y), z):
... print x, y, z
...
>>> test((1, 2), 3)
1 2 3
算術演算子
- +, -, *, /, +=, -=, *=, /=, %=, %, (, ) などはC言語•MELと同じ
ただし、文字列に対して+, *は特別な意味がある
- 文字列1 + 文字列2
- 文字列1 と 文字列2 の結合
- n * 文字列
- 文字列 のn回繰り返し
また、%, %= は実数にも使用可能である。
- ** は累乗
- ++, -- は無し
- ビット演算
- |
- 論理和
- &
- 論理積
- ^
- 排他的論理和
- <<
- 左シフト
- >>
- 右シフト
リスト
- 空リスト
- [ ]
- 初期化
-
- 変数 = [要素1, 要素2,...]
- [ ] 内に,で区切って並べる
- 変数 = [要素1,]
- 要素がひとつの場合
- 要素の追加
-
- リスト.append(要素)
- リストの最後に要素を追加
- リスト = リスト1 + リスト2
- リスト1とリスト2を結合
- リスト1 += リスト2
- リスト1の最後にリスト2を結合
- リスト.extend(要素)
- リストの最後に要素をに追加
要素がリストなら、展開してリストの最後に追加
- リスト.insert(n, 要素)
- n番目に要素を追加
- リスト[n:n] = [要素]
- n番目に要素を追加
>>> a = [1, 2, 3]
>>> a[2:2] = [4]
>>> a
[1, 2, 4, 3]
>>> a[0:0] = [5]
>>> a
[5, 1, 2, 4, 3]
>>> a[3:3] = [6, 7]
>>> a
[5, 1, 2, 6, 7, 4, 3]
- インデクシング
-
- リストのn番目
- リスト[n]
- リストのn1番目から(n2-1)番目まで
- リスト[n1:n2]
- リストのn1番目からn3飛ばしで(n2-1)番目まで
- リスト[n1:n2:n3]
- リスト全部
- リスト[:]
- リストの0番目から(n-1)番目まで
- リスト[:n]
n が負数の場合は0番目から、最後から(-n)+1番目まで
- リストのn番目から最後まで
- リスト[n:]
または
リスト
- 要素の置換
-
- リストのn番目をxに入れ替える
- リスト[n] = x
- リストのm番目からn-1番目を[x, y, z]に入れ替える
- リスト[m:n] = [x, y, z]
- 要素の削除
-
- n番目を削除
- del リスト[n]
または
リスト.pop(n)
- m番目からn-1番目を削除
- del リスト[m:n]
- 値がxである要素を削除
- リスト.remove(x)
- 最後の要素を削除して、その値を返す
- リスト.pop()
- すべての要素を削除
- del リスト[:]
リスト[:] = []
- リストの要素数
- リストの全要素数
- len(リスト)
- リスト中のxの数
- リスト.count(x)
- リストの逆順
- 変数 = リスト.reverse()
- リストの検索
- 変数 = リスト.index(s)
変数 = リスト.index(s, 開始インデックス)
変数 = リスト.index(s, 開始インデックス, 終了インデックス)
要素がsであるものを検索、無ければValueErrorを送出する。
- xがリストに含まれるかどうか
- x in リスト
xがリストに含まれないとき
- x not in リスト
- タプルへの変換
- 変数 = tuple(リスト)
- ソート
- リスト.sort()
リスト.sort(key=関数)
リスト.sort(key=関数, 並び順)
関数は引数がひとつ、並び順がTrueなら順番が逆転する。
- 内包表記
- [式 for 変数 in リスト]
[式 for 変数 in リスト if 条件]
内包表記は入れ子にできる。
>>> a = []
>>> for i in range(5):
... x = 2 * i
... a.append(x)
...
>>> print a
[0, 2, 4, 6, 8]
>>> [2 * i for i in range(5)]
[0, 2, 4, 6, 8]
>>> [x for x in range(10) if x % 2 == 1]
[1, 3, 5, 7, 9]
>>> [(x, y) for x in range(3) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
タプル
要素を変更できないリスト(immutable)
- 初期化
-
- 変数 = (要素1, 要素2,...)
- ( )の中に,で区切って並べる
- 変数 = 要素1, 要素2,...
- ,で区切って並べる
- 変数 = (要素1,)
- 要素がひとつの場合
- 要素の追加
- 変数 = タプル + (要素1、...)
append()は使えない
- インデクシングはリストと同じ
- 要素の削除はできない
- delは使えない
- リストへの変換
- 変数 = list(タプル)
辞書
- 空の辞書
- { }
- 初期化
- 変数 = {キー1:値1, ...}
または
- 変数 = dict({キー1=値1, ...})
- 辞書のコピー
- 変数 = dict([[キー1, 値1], ...])
- リストのリストから作成
- 変数 = dict(キー1=値1, ...)
- キーと値の組から作成
キーは変更不可オブジェクト(immutable)のみ(数値、文字列、タプルなど)
- 要素の追加
- 辞書[キー2] = 値2
- 他の辞書とのマージ
- 辞書.update({キー2:値2, ...})
- インデクシング
- 辞書[キー]
- 要素の削除
- del 辞書[キー]
- 要素数
- len(辞書)
- 要素の存在
- 辞書.has_key(キー)
または
キー in 辞書
- キーが存在しなければデフォルト値を返す
- 辞書.get(キー, デフォルト値)
- キーが存在しなければデフォルト値を設定
- 辞書.setdefault(キー, デフォルト値)
- すべてのキーと値
- 辞書.items()
- すべてのキー
- 辞書.keys()
- すべての値
- 辞書.values()
- 要素を取り出して削除
- 辞書.pop(キー)
- 要素を取り出して削除、要素がない時はデフォルト値
- 辞書.pop(キー, デフォルト値)
- 要素をランダムに取り出して削除
- 辞書.popitem(キー)
- 辞書をクリアして、すべての要素を削除
- 辞書.clear()
- 内包表記
- {式:式 for 変数 in リスト}
{式:式 for 変数 in リスト if 条件}
>>> d1 = {i:2*i for i in range(5)}
>>> d1
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
>>> d2 = {'key'+str(i):i for i in range(5)}
>>> d2
{'key3': 3, 'key2': 2, 'key1': 1, 'key0': 0, 'key4': 4}
>>> d3 = {i:3*i for i in range(5) if i % 2 == 0}
>>> d3
{0: 0, 2: 6, 4: 12}
set型
set型は、同じ要素を持たない集合を作成できる。
- set(リスト)
- 初期化
- set型.add(s)
- sを追加
- set型.remove(s)
- sを削除
- set型1.union(set型2)
- set型1とset型2の和集合
- set型1.intersection(set型2)
- set型1とset型2の積集合
- set型1.difference(set型2)
- set型1とset型2の差集合
- set型1.symmetric_difference(set型2)
- set型1とset型2の対称的差集合
>>> s1=set([1,2,3])
>>> s1
set([1, 2, 3])
>>> s2=([2,3,4])
>>> s1.union(s2)
set([1, 2, 3, 4])
>>> s1.intersection(s2)
set([2, 3])
>>> s1.difference(s2)
set([1])
>>> s1.symmetric_difference(s2)
set([1, 4])
- 内包表記
- {式 for 変数 in リスト}
{式 for 変数 in リスト if 条件}
>>> s1 = {i for i in range(5)}
>>> s1
set([0, 1, 2, 3, 4])
>>> s2 = {i for i in range(5) if i % 2 == 0}
>>> s2
set([0, 2, 4])
イテレータ
__iter__()メソッドとnext()メソッドを実装したクラスがイテレータになる。
class myIterator(object):
def __init__(self, data):
self.data = data
self.__i = len(data)
def __iter__(self):
return self
def next(self):
if self.__i == 0:
raise StopIteration
self.__i -= 1
return self.data[self.__i]
>>> i = myIterator([1,2,3,4,5])
>>> i.next()
5
>>> i.next()
4
>>> i.next()
3
>>> i.next()
2
>>> i.next()
1
>>> i.next()
Traceback (most recent call last):
File "", line 1, in
File "", line 9, in next
StopIteration
関数
Pythonの関数はファーストクラスオブジェクトである。
- 関数定義
-
def 関数名([引数, ...]):
[Python 文]
- 引数
-
- キーワード引数
- 引数=デフォルト値
デフォルト値はimmutableな値にすること。
- *arg
- タプルargとして引数を得る
- **arg
- 辞書argとして引数を得る
(実行例)
>>> def test1(a=1, b=2):
... print a,b
...
>>> test1()
1 2
>>> test1(3)
3 2
>>> test1(3, 4)
3 4
>>> test1(a=3, 4)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> test1(a=3, b=4)
3 4
>>> test1(b=3, a=4)
4 3
>>> test1(5, b=6)
5 6
>>> def test2(a, b=2):
... print a,b
...
>>> test2(1)
1 2
>>> test2()
Traceback (most recent call last):
File "", line 1, in
TypeError: test2() takes at least 1 argument (0 given)
>>> test2(b=3)
Traceback (most recent call last):
File "", line 1, in
TypeError: test2() takes at least 1 non-keyword argument (0 given)
>>> test2(3, b=4)
3 4
>>> def test3(*argv):
... print argv
...
>>> test3(1)
(1,)
>>> test3(1, 2)
(1, 2)
>>> test3(1, 2, 3)
(1, 2, 3)
>>> def test4(**argv):
... print argv
...
>>> test4(a=1, b=2, c=3)
{'a': 1, 'c': 3, 'b': 2}
>>> def test5(*argv1, **argv2):
... print argv1, argv2
...
>>> test5(1, 2, 3, a=4, b=5)
(1, 2, 3) {'a': 4, 'b': 5}
>>> def test6(a, b, *argv1, **argv2):
... print a, b, argv1, argv2
...
>>> test6(1, 2, 3, 4, 5, c=6, d=7)
1 2 (3, 4, 5) {'c': 6, 'd': 7}
>>> >>> def test(a=[]): # デフォルト値がimmutableではない例
... a.append(0)
... return a
...
>>> print test()
[0]
>>> print test()
[0, 0]
>>> print test()
[0, 0, 0]
- 返り値
- return によって値を返す。
どんなオブジェクトでも、返り値として返すことができる。
関数は、変数•リスト•辞書に代入したり関数の引数•返り値にしたりすることができる。
>>> def f1(x):
... return 2*x
...
>>> f2 = f1
>>> print f2(2)
4
>>> def f3(f):
... print f(3)
...
>>> f3(f1)
6
関数のネスト
関数の中に関数を定義することができる。
>>> def f1():
... def f2():
... print "f2"
... print "f1"
... return f2
...
>>> f = f1()
f1
>>> f()
f2
>>>
内側の関数から外側の関数の変数を参照できるが、代入はできない。
>>> def f1(x):
... def f2(y):
... print x + y
... return f2
...
>>> f = f1(3)
>>> f(2)
5
>>> f = f1(5)
>>> f(3)
8
ジェネレータ
yield文によって値を返す関数。
def listup(strlist):
if not strlist:
yield ''
return
for s1 in strlist[0]:
for s2 in listup(strlist[1:]):
yield s1 + s2
return
for s in listup(['abc','123']):
... print s
...
a1
a2
a3
b1
b2
b3
c1
c2
c3
c3
lambda式
lambda式によって無名関数を定義することができます。
この式は以下の関数定義と同じです。
def func(args):
return expr
例
>>> f1 = lambda x: 2*x
>>> f2 = lambda x: 3*x
>>> f1(5)
10
>>> f2(5)
15
クロージャ
グローバルなスコープ以外で定義された関数は、定義された時のスコープの情報を持っている。
>>> def test1(x):
... def infunc():
... return 2*x
... return infunc
...
>>> f1 = test1(2)
>>> f2 = test1(3)
>>> f1()
4
>>> f2()
6
デコレータ
関数を引数にとり、新しい関数を返す呼び出し可能なものをデコレータと言います。
>>> def wrap(func):
... def inner():
... print 'prev func'
... func()
... print 'after func'
... return inner
...
>>> @wrap
... def test():
... print 'in func'
...
>>> test()
prev func
in func
after func
これは以下と同じです。
>>> f = wrap(test)
>>> f()
prev func
in func
after func
制御構造
- if
-
if 式1:
Python 文 1
[elif 式2:]
[Python 文 2]
.
.
[else:]
[Python 文 n]
式が真になるのは以下の場合
- True
- 0以外の数値
- 空で無い文字列
- 空で無いリスト、タプル、辞書
式が偽になるのは以下の場合
- False
- None
- 0 または 0.0
- 空文字列
- 空のリスト、タプル、辞書
- for
-
オブジェクトから要素を1つずつPython文1を実行、ループが終了したらPython文2を実行
for 変数 in オブジェクト:
Python文1
[else:]
[Python文2]
(例)
print 文を5回実行
for i in range(5):
print i
0
1
2
3
4
- while
-
式が真の間、Python文を実行
while 式:
Python文
(例)
print 文を5回実行
i = 0
while i < 5:
print i
i += 1
0
1
2
3
4
- break
- ループの流れを中断して、ループを終了
- continue
- ループの流れを中断して、ループの最初から再実行
条件演算子
- C言語•MELなどと同じもの
- ==, !=, <, >, <=, >=, ( )
- is
- 左右のオブジェクトが等しい(同じ参照)
>>> r1 = [1, 2, 3]
>>> r2 = r1
>>> print r1 is r2
True
>>> r1 = [1, 2, 3]
>>> r2 = [1, 2, 3]
>>> print r1 is r2
False
(注意)
文字列の場合はTrueになる場合がある。
>>> s1 = 'test'
>>> s2 = 'test'
>>> print s1 is s2
True
- is not
- 左右のオブジェクトが等しくない(違う参照)
- and
- 左右の条件がどちらも成り立つ場合
- or
- 左右の条件がどちらかが成り立つ場合
- not
- 条件の否定
ビルトイン関数
- print(値, ...)
- 値を標準出力へ出力
- range(n)
- 0からn-1までのリストを返す
>>> range(6)
[0, 1, 2, 3, 4, 5]
- range(n1, n2)
- n1からn2-1までのリストを返す
>>> range(2, 6)
[2, 3, 4, 5]
- range(n1, n2, n3)
- n1からn2-1までn3飛ばしのリストを返す
>>> range(3, 15, 2)
[3, 5, 7, 9, 11, 13]
- open(ファイル名、'モード')
- ファイルをモードに従ってオープン
モード一覧
- r
- 読み込み
- w
- 書き込み
- a
- 追加
- r+
- 読み書き(ファイルが存在しないとエラー)
- w+
- 読み書き(ファイルが存在しないと新規作成)
- a+
- 読み書き(追加)
- b
- バイナリ
- type(オブジェクト)
- オブジェクトの型を調べる
>>> type(3.5)
<type 'float'>
>>> x = [1, 2, 3]
>>> type(x)
<type 'list'>
- isinstance(オブジェクト, 型)
- オブジェクトの型を調べる
オブジェクトと型が等しいときにTrueを返す。
>>> isinstance(3.5, float)
True
>>> x = [1, 2, 3]
>>> isinstance(x, list)
True
- getattr(オブジェクト, アトリビュート名)
- オブジェクトのアトリビュートを返す
- setattr(オブジェクト, アトリビュート名, 値)
- オブジェクトのアトリビュートに値を代入する
- abs(x)
- xの絶対値
- cmp(x, y)
- xとyを比較して、等しければ0、x < y ならば1、x > y ならば-1を返す
>>> cmp(1, 2)
-1
>>> cmp(2, 1)
1
>>> cmp(2, 2)
0
>>> cmp('a', 'b')
-1
>>> cmp('b', 'a')
1
>>> cmp('c', 'c')
0
- chr(n)
- nをアスキーコードとする文字
>>> chr(123)
'{'
>>> print [chr(i) for i in range(32, 50)]
[' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1']
- dir()
- オブジェクトの属性リスト
- dir(オブジェクト)
- オブジェクトの属性リスト
- eval(s)
- sをPython式として実行
- execfile(ファイル名)
- ファイルから文字列を読み込んで実行
- file(fn, mode)
- ファイル名fnのファイルをモードmodeでオープン
- filter(func, リスト)
- リストの要素の要素から、関数funcの返り値が真の要素だけのリストを作成
>>> a = [1,2,3,4,5]
>>> filter(lambda x: x > 3, x)
[4, 5]
>>> filter(lambda x: x % 2, x)
[1, 3, 5]
- float(s)
- 文字列を実数に変換
- format(s)
- 文字列のフォーマット
- hex(n)
- 整数を16進数の文字列に変換
- bin(n)
- 整数を2進数の文字列に変換
- oct(n)
- 整数を8進数の文字列に変換
- int(s)
- 文字列を整数に変換
- int(s, base)
- 文字列をbase進数の整数に変換
>>> int('24', 16)
36
>>> int('25', 8)
21
>>> int('100100', 2)
36
- str(n)
- オブジェクトnを文字列に変換
>>> str(123)
'123'
>>> str(3.14)
'3.14'
>>> str([1, 2, 3])
'[1, 2, 3]'
- iter(o)
- __iter__()メソッドか__getitem__()をサポートするオブジェクトoをイテレータオブジェクトに変換して返す
- iter(o, s)
- oは呼び出し可能オブジェクトで、返り値がsになったときStopIterationが送出される
空行を読み込むまでファイルからデータを読み込むスクリプト。
with open('file') as fp:
for data in iter(fp.readline, ''):
print data
- len(シーケンス)
- リスト、タプル、辞書の要素数
- list(タプル)
- シーケンス、イテレータ、反復コンテナをリストに変換
- locals()
- ローカルな名前空間の値を辞書で返す
- globals()
- グローバルな名前空間の値を辞書で返す
- long(s)
- 文字列を長整数に変換
- long(s, base)
- 文字列をbase進数の長整数に変換
- map(func, リスト, ...)
- すべてのリストの要素に関数funcを適用した結果をリストにして返す
>>> def f1(x):
... return 2*x
...
>>> a = [1, 2, 3]
>>> print map(f1, a)
[2, 4, 6]
...
>>> def f2(x, y):
... return x + y
...
>>> b = [1, 3, 5]
>>> c = [2, 4, 6]
>>> print map(f2, b, c)
[3, 7, 11]
- min(x1, ...)
- すべての引数のうちで最小値
- min(リスト)
- リストの要素の中で最小値
- max(x1, ...)
- すべての引数のうちで最大値
- max(リスト)
- リストの要素の中で最大値
- oct(n)
- 整数を8進数の文字列に変換
- ord(c)
- 文字のASCII値
>>> ord('A')
65
>>> ord('\n')
10
- pow(x, y[, z])
- xのy乗、zがあれば、その%zの値
- raw_input([プロンプト])
- 標準入力から入力
- reduce(func, リスト)
- 関数を累積的に適用
>>> a = [1,2,3,4,5]
>>> reduce(lambda x,y: x+y, a)
15
>>> reduce(lambda x,y: x*y, a)
120
- reload(モジュール)
- モジュールの再ロード
- str(s)
- 文字列への変換
- sum(リスト)
- リストの要素の合計
- super(子クラス, self)
- 子クラスの親クラスを返す
- tuple(リスト)
- タプルへの変換
- zip(リスト, ...)
- リストの要素をひとつのタプルへまとめて返す
- enumerate(リスト)
- ループカウンタの数値とリストの要素を返す
クラス
定義
class クラス名([親クラス名, ...]):
クラス変数 = 初期値
.
.
def メソッド名(self, ...):
クラス名.クラス変数 = 値
self.クラス変数 = 値
self.インスタンス変数 = 値
内部変数 = 値
その他の Python 文
.
.
.
.
Pythonのクラスには旧スタイルと新スタイルがある。
親クラスを定義しなければ旧スタイルに、親クラスにobjectを指定すると新スタイルになる。
機能や互換性の問題から、なるべく新スタイルにしておくことが推奨される。
(例1)
class myClass1(object):
c1 = 1
def __init__(self):
self.i1 = 2
>>> class1 = myClass1()
>>> class1.c1
1
>>> class1.i1
2
>>> class2 = myClass1()
>>> class2.c1
1
>>> class2.i1
2
>>> myClass1.c1 = 3
>>> class1.c1
3
>>> class1.i1
2
>>> class2.c1
3
>>> class2.i1
2
>>> class2.c1 = 4
>>> class1.c1
3
>>> class2.c1
4
>>> myClass1.c1 = 5
>>> class1.c1
5
>>> class2.c1
4
(例2)
class Test1(object):
def __init__(self):
self.x = 1
class Test2(Test1):
def __init__(self):
super(Test2, self).__init__()
self.y = 2
class Test3(Test2):
def __init__(self):
super(self.__class__, self).__init__()
self.z = 3
>>> c1 = Test1()
>>> c1.x
1
>>> c2 = Test2()
>>> c2.x
1
>>> c2.y
2
>>> c3 = Test3()
>>> c3.x
1
>>> c3.y
2
>>> c3.z
3
特殊メソッド
- __add__(self, obj)
- 加算(+)を実行したときに呼び出されるメソッド
- __iadd__(self, obj)
- 加算(+=)を実行したときに呼び出されるメソッド
- __sub__(self, obj)
- 減算(-)を実行したときに呼び出されるメソッド
- __isub__(self, obj)
- 減算(-=)を実行したときに呼び出されるメソッド
- __mul__(self, obj)
- 乗算(*)を実行したときに呼び出されるメソッド
- __imul__(self, obj)
- 乗算(*=)を実行したときに呼び出されるメソッド
- __truediv__(self, obj)
- 除算(/)を実行したときに呼び出されるメソッド
- __itruediv__(self, obj)
- 除算(/=)を実行したときに呼び出されるメソッド
- __floordiv__(self, obj)
- 除算(//)を実行したときに呼び出されるメソッド
- __ifloordiv__(self, obj)
- 除算(//=)を実行したときに呼び出されるメソッド
- __rlshift__(self, obj)
- 左シフト(<<)を実行したときに呼び出されるメソッド
- __rrshift__(self, obj)
- 右シフト(>>)を実行したときに呼び出されるメソッド
- __rand__(self, obj)
- 論理演算子(&)を実行したときに呼び出されるメソッド
- __rxor__(self, obj)
- 論理演算子(^)を実行したときに呼び出されるメソッド
- __ror__(self, obj)
- 論理演算子(|)を実行したときに呼び出されるメソッド
- __and__(self, obj)
- ビット演算(&)を実行したときに呼び出されるメソッド
- __or__(self, obj)
- ビット演算(|)を実行したときに呼び出されるメソッド
- __eq__(self, obj)
- selfとobjが等しい場合Trueを返し、等しくない場合Falseを返すメソッド
- __ne__(self, obj)
- selfとobjが等しくない場合Trueを返し、等しい場合Falseを返すメソッド
- __lt__(self, obj)
- selfがobjより小さい場合Trueを返し、そうで無い場合Falseを返すメソッド
- __le__(self, obj)
- selfがobjより小さいか等しい場合Trueを返し、そうで無い場合Falseを返すメソッド
- __gt__(self, obj)
- selfがobjより大きい場合Trueを返し、そうで無い場合Falseを返すメソッド
- __ge__(self, obj)
- selfがobjより大きいか等しい場合Trueを返し、そうで無い場合Falseを返すメソッド
- __int__(self)
- int()によって整数変換される場合に呼び出されるメソッド
- __float__(self)
- float()によって実数変換される場合に呼び出されるメソッド
- __str__(self)
- str()によって文字列変換される場合に呼び出されるメソッド
- __repr__(self)
- インスタンスを印字可能文字列に変換するメソッド
__str__() が定義されていないときも呼び出される。
- __bytes__(self)
- bytes() によって整数変換される場合に呼び出されるメソッド
- __format__(self, form)
- format() によって文字列フォーマットされる場合に呼び出されるメソッド
- __len__(self)
- len() を実行した場合に呼び出されるメソッド
要素の個数を返す。
- __getitem__(self, key)
- 要素keyを参照する場合に呼び出されるメソッド
リスト型の場合はkeyが整数、辞書型の場合はkeyが変更不能なオブジェクトになる。
- __setitem__(self, key, item)
- 要素keyにitemを代入する場合に呼び出されるメソッド
- __delitem__(self, key)
- del()を実行した場合に呼び出されるメソッド
keyにあたる要素を削除する。
- __iter__(self)
- iter()を実行した場合に呼び出されるメソッド
__next__() メソッドを定義したイテレータオブジェクトを返す。
- __contains__(self, item)
- 比較演算子inを実行した場合に呼び出されるメソッド
itemが存在すればTrueを返し、存在しなければFalseを返す。
- __getattr__(self, attr)
- 存在しないアトリビュートがアクセスされた場合に呼び出されるメソッド
attrはアクセスされたアトリビュート名。
存在しないことにしたければ、AttributeError例外を送出する。
- __getattribute__()
- アトリビュートがアクセスされた場合に呼び出されるメソッド
- __setattr__(self, attr, value)
- アトリビュートに値を代入された場合に呼び出されるメソッド
無限ループになるので
self.attr = value
は実行してはならない。
- __call__(self[, attr, ...])
- オブジェクトを関数として実行した場合に呼び出されるメソッド
- __del__(self)
- オブジェクトがメモリ上から削除される場合に呼び出されるメソッド
- __hash__(self)
- hash()を実行した場合に呼び出されるメソッド
例外
- 例外の補足
-
try:
[Python文1]
except [例外クラス名[ as 変数名]]:
[Python文2] # Python文1で例外が発生すると実行される
else:
[Python文3] # 例外が発生しないと実行される
finally:
[Python文4] # 例外が発生してもしなくても実行される
例外クラス名が無ければ、すべての例外を補足する。
as 変数名 よって変数に例外オブジェクトを代入する。
- 例外の発生
-
raise 例外クラス([文字列])
- トレースバック
-
import traceback
try:
[Python文]
except:
traceback.print_exc() # 例外の表示(エラー内容の文字列を返す)
例外の種類
- SyntaxError
- プログラム実行前のエラー
- IndentationError
- インデントが正しくない
- Exception
- プログラム実行中のエラー
- NameError
- 未定義変数•関数•モジュールを参照したとき
- AttributeError
- オブジェクトに未定義の属性を参照したとき
- TypeError
- 間違った型の使い方をしたとき
- IndexError
- リストなどで要素数を超えたインデックスを参照したとき
- KeyError
- 辞書などで間違ったキーを与えたとき
- ImportError
- モジュールを見つけられないとき
- UnicodeDecodeError
- UnicodeEncodeError
- 文字列のデコード•エンコードのエラー
- ZeroDivisionError
- 0による除算
自作の例外
Exceptionを親クラスにして作成する。
(例)
myexception.py
class MyException(Exception):
def __init__(self):
print 'my exception'
super(MyException, self).__init__()
def test():
raise MyException
try:
test()
except MyException:
print 'get MyException'
>>> python myexception.py
my exception
get MyException
文字列メソッド
- decode(encoding[, error])
- バイト文字列を文字コードencodingで文字列に変換
encodingに使用できる文字列
- utf-8
- UTF-8
- shift-jis, shift_jis, sjis
- シフトJIS
- euc-jp
- EUC-JP
- iso-2022-jp
- JIS
errorは、変換エラーへの対処方法を表す文字列
- strict
- 例外を発生(デフォルト)
- replace
- 変換できない文字は?などの文字に変換
- ignore
- 変換できない文字は削除
- encode(encoding[, error])
- 文字コードencodingでエンコード
- endwith(s)
- 文字列がsで終わっているかどうかを返す
- find(s)
- 文字列sのインデクスを返す
見つからなかったら-1を返す。
- format(s1, ...)
- s1以下の引数を使用してフォーマットする
文字列の中の{}部分に引数が差し込まれる。
- {番号}
- 番号番目の引数を差し込む
>>> '{0}aaa{1}bbb{2}'.format(1, 2, 3)
'1aaa2bbb3'
- {キーワード}
- キーワード引数を差し込む
>>> 'aaa{k}bbb'.format(k=123)
'aaa123bbb'
- {キーワード}
- 辞書を使って差し込む
>>> 'aaa{k}bbb'.format(**{'k':123})
'aaa123bbb'
- {番号:桁}
- 番号の引数を桁の幅で差し込む
>>> 'aaa{0:5}bbb'.format(123)
'aaa 123bbb'
- {番号:[オプション]桁}
- 番号の引数をオプションによって右・左・中央寄せして桁の幅で差し込む
- <
- 左寄せ
- >
- 右寄せ
- ^
- 中央寄せ
>>> 'aaa{0:<5}bbb'.format(123)
'aaa123 bbb'
- {番号:桁[オプション]}
- 番号の引数をオプションを使用して変換し桁の幅で差し込む
- b
- 2進数
- d
- 10進数
- o
- 8進数
- x
- 16進数
- X
- 16進数
>>> 'binary{0:5b}, octal{1:5o}, hexadecimal{2:5x}, hexadecimal{2:5X}'.format(12, 32, 232)
'binary 1100, octal 40, hexadecimal e8, hexadecimal E8'
- index(s)
- 文字列sのインデクスを返す
見つからなかったらValueErrorを送出。
- isdigit(s)
- すべての文字が数字かどうか
- join(s)
- 文字列を区切り文字として、リストsの要素を結合した文字列を返す
>>> ''.join(['aa','bb'])
'aabb'
- ljust(幅, 埋める文字)
- 幅の数値だけ左寄せして埋める文字によって埋めた文字列を返す
埋める文字を省略すると空白文字になる。
>>> s = '123'
>>> s.ljust(5, '0')
'12300'
- lower()
- 小文字に変換した文字列を返す
- replace(s1, s2)
- s1をs2に変換した文字列を返す
- rfind(s)
- 文字列sの後方から検索したインデクスを返す
見つからなかったら-1を返す。
- rindex(s)
- 文字列sの後方から検索したインデクスを返す
見つからなかったらValueErrorを送出。
- rjust(幅, 埋める文字)
- 幅の数値だけ右寄せして埋める文字によって埋めた文字列を返す
埋める文字を省略すると空白文字になる。
>>> s = '123'
>>> s.rjust(5, '0')
'00123'
- split()
- 空白文字で分割した単語のリストを返す
>>> x = '1 2 3'
>>> x.split()
['1', '2', '3']
文字列が空、または空白文字の場合は空リストを返します。
>>> y = ''
>>> y.split()
[]
- split(s)
- 文字sで分割した単語のリストを返す
>>> x = '1/2/3'
>>> x.split('/')
['1', '2', '3']
- startwith(s)
- 文字列がsで始まっているかどうかを返す
- strip()
- 先頭•末尾の空白文字を削除した文字列を返す
- strip(s)
- 先頭•末尾のsに含まれる文字を削除した文字列を返す
- title()
- 先頭文字を大文字にした文字列を返す
- upper()
- 大文字に変換した文字列を返す
ファイルオブジェクトのメソッド
- close()
- ファイルを閉じる
- flush()
- バッファのフラッシュ
- read()
- 全データの読み込み
- read(size)
- 最大sizeバイト読み込み
- readline()
- 一行読み込み
- readlines()
- 全行をリストにして読み込み
- seek(offset)
- ファイルの現在位置をoffsetにする
- tell()
- ファイルの現在位置を返す
- write(s)
- 文字列sを書き込み
- writelines(list)
- リストlist中の文字列を書き込み
モジュール
- import モジュール名
- モジュールをインポート
- from モジュール名 import 関数名[, 関数名...]
- モジュールから関数をインポート
関数名に
*
を使うとすべての関数をインポート
同一名の関数をインポートすると後からインポートした関数が有効
- import モジュール名 as 別名
- モジュールを別名でインポート
モジュールファイル
- モジュールは普通のPythonスクリプト
- モジュールがインポートされるとPythonスクリプトとして実行される
- インポート時に実行されないようにするには
if __name__ == '__main__':
というifブロックを使う
- 拡張子.pyを含まない名前がモジュール名になる
- モジュールファイル名の条件
- 数字から始まらない
- . (ドット)から始まらない
- 特別な理由が無い限り英字小文字のみ
パッケージ
- パッケージはモジュールを入れたフォルダ(ディレクトリ)
- パッケージのフォルダ(ディレクトリ)には __init__.py というファイルを入れる
- __init__.py はモジュールインポート時に実行される
- __init__.py は必要なければ空で良い
モジュール検索順
- 実行しているスクリプトのあるフォルダ(ディレクトリ)
- カレントフォルダ(ディレクトリ)
- 環境変数PYTHONPATHに設定されたフォルダ(ディレクトリ)
- 標準ライブラリのフォルダ(ディレクトリ)
- 標準ライブラリのフォルダ(ディレクトリ)にある追加パッケージ用のsite-packagesフォルダ
標準ライブラリ
- sys
- システム関数
- sys.argv
- 実行時の引数のリスト
sys.argv[0] はスクリプト名、sys.argv[1:] が引数部分
- sys.exit([n])
- Pythonを終了
nは終了ステータス(整数または整数以外のオブジェクト)
- sys.path
- モジュール検索パスのリスト
- sys.platform
- プラットフォーム識別文字列
- 'win32'
- Windows
- 'darwin'
- Mac OS X
- sys.modules
- import済のモジュールのリスト
- sys.stdin
- 標準入力
- sys.stdout
- 標準出力
- sys.stderr
- 標準エラー出力
- os
- ファイル、プロセスなどオペレーティングシステム関係
- os.chdir(path)
- カレントフォルダ(ディレクトリ)のpathへの移動
- os.getcwd()
- カレントフォルダ(ディレクトリ)
- os.mkdir(path)
- フォルダ(ディレクトリ)作成
- os.remove(path)
- ファイル削除
- os.rename(src, dst)
- ファイル名をsrcからdstに変更
- os.rmdir(path)
- フォルダ(ディレクトリ)削除
- os.walk(path)
- path以下のフォルダ•ファイルを走査
返り値は、(フォルダ名, その中のフォルダ名のリスト, ファイル名のリスト)というタプルを返すジェネレータ
- math
- 数学関数
- math.cail(x)
- x以上で最も小さい整数、返り値はfloat
- math.fabs(x)
- xの絶対値
- math.floor(x)
- x以下で最も小さい整数、返り値はfloat
- math.modf(x)
- xの少数部分と整数部分をタプルで返す
- math.exp(x)
- eのx乗
- math.log(x)
- xの自然対数
- math.pow(x, y)
- xのy乗
- math.sqrt(x)
- xの平方根
- math.hypot(x, y)
- ユークリッド距離(sqrt(x*x + y*y))
- math.sin(x)
- xの正弦
- math.cos(x)
- xの余弦
- math.tan(x)
- xの正接
- math.asin(x)
- xの逆正弦
- math.acos(x)
- xの逆余弦
- math.atan(x)
- xの逆正接
- random
- 乱数
- random.seed()
- 乱数の初期化
- random.choice(リスト)
- リストから任意の要素を返す
>>> a = [1,2,3,4,5]
>>> random.choice(a)
3
- random.random()
- 0.0から1.0までの乱数を返す
- random.shuffle(リスト)
- リストの要素をかき混ぜて順番を変更
>>> a = [1,2,3,4,5]
>>> random.shuffle(a)
>>> print a
[2, 3, 1, 5, 4]
- random.sample(リスト, n)
- リストからn個の要素を混ぜて取り出したリストを返す
>>> a = [1,2,3,4,5]
>>> random.sample(x, 3)
[3, 1, 2]
- random.uniform(a, b)
- aからbまでの乱数を返す
- re
- 正規表現
- re.compile(pattern)
- patternを正規表現オブジェクトにコンパイル
- re.findall(pattern, s)
- sの中にあるpatternに一致する部分をリストにして返す
>>> re.findall('ab*', 'abcabbc')
['ab', 'abb']
- re.split(pattern, s)
- sをpatternで分解したリストを返す
>>> re.split('ab*', 'abcabbc')
['', 'c', 'c']
- re.sub(pattern, s1, s2)
- s2の中にあるpatternに一致する部分をs1に変換
>>> re.sub('ab*', 'dd', 'abcabbc')
'ddcddc'
特殊文字
- .
- 改行以外の任意の文字
- ^
- 文字列の先頭
- $
- 文字列の末尾
- *
- 直前文字の0回以上の繰り返し
- +
- 直前文字の1回以上の繰り返し
- ?
- 直前文字の0回か1回の繰り返し
- *?, +?, ??
- 各パターンの最小一致
- {m}
- 直前文字のm回の繰り返し
- {m,n}
- 直前文字のm回からn回の繰り返し
- {m,n}?
- 直前文字のm回からn回の繰り返しの最小一致
- \
- 特殊文字のエスケープ
- []
- 文字の集合を定義
- |
- どちらかの正規表現にマッチ
- ()
- グループ化
- struct
- バイナリデータ
>>> a = struct.pack('BBB', 1,2,3)
>>> a
'\x01\x02\x03'
>>> a += struct.pack('BBB', 4,5,6)
>>> a
'\x01\x02\x03\x04\x05\x06'
>>> a += struct.pack('i', 256)
>>> a
'\x01\x02\x03\x04\x05\x06\x00\x01\x00\x00'
>>> b = struct.unpack('6B', a[0:6])
>>> b
(1, 2, 3, 4, 5, 6)
>>> b = struct.unpack('i', a[6:])
>>> b
(128,)
フォーマット文字列
文字 | 意味 | バイト数 |
c | char | 1 |
b | signed char | 1 |
B | unsigned char | 1 |
? | _Bool | 1 |
h | short | 1 |
H | unsigned short | 2 |
i | int | 4 |
I | unsigned int | 4 |
l | long | 4 |
L | unsigned long | 4 |
q | long long | 8 |
Q | unsigned long long | 8 |
f | float | 4 |
d | double | 8 |
s | char[] | * |
p | char[] | * |
P | void * | * |
- time
- 時間
時間経過測定(秒)
>>> t1 = time.time()
>>> t2 = time.time()
>>> print t2 - t1
3.71265101433
- datetime
- 日付•時刻
今日の年月日時分秒
>>> now = datetime.datetime.now()
>>> now.strftime('%Y/%m/%d' - %H:%M:%S)
'2014/11/11 - 12:11:16'
>>> now.hour
12
>>> now.minute
11
>>> now.second
16
- calendar
- カレンダー
- urllib
- WWW用のインターフェイス
インターネットからダウンロードしたデータをファイルの保存
urllib.urlretrieve('http://www.google.com/', 'tmp.html')
- csv
- CSVファイルへの読み書き
>>> with open('tmp.csv', 'w') as fp:
... wt = csv.writer(fp)
... wt.writerow([1, 2, 3])
... wt.writerow([4, 5, 6, 7, 8])
...
>>>
>>> with open('tmp.csv') as fp:
... rd = csv.reader(fp)
... for r in rd:
... print r
...
['1', '2', '3']
['4', '5', '6', '7', '8']
- shelve
- オブジェクトの永続化•シリアライズ
>>> s = shelve.open('tmp.db')
>>> s['a'] = {'a': 1, 'c': [3, 4, 5], 'b': 2}
>>> s['b'] = [1, 2, 3]
>>> class Test1(object):
... def __init__(self, n):
... self.n = n
... def out(self):
... print self.n
...
>>> s['c'] = Test1('name1')
>>> s['d'] = Test1('name2')
>>> s.close()
>>>
>>> s = shelve.open('tmp.db')
>>> print s['a']
{'a': 1, 'c': [3, 4, 5], 'b': 2}
>>> print s['b']
[1, 2, 3]
>>> s['c'].out()
name1
>>> s['d'].out()
name2
- pickle
- オブジェクトの永続化•シリアライズ
ただし、Pythonでしか使用できない
シリアライズできるもの
- None, True, False
- 数値
- 文字列
- リスト、タプル、辞書、セット
- モジュールトップレベルで定義された関数、ビルトイン関数、クラス
- __dict__ または __setstate__() を pickle 化できるクラスのインスタンス
>>> a = {'a':1, 'b':2, 'c':[3, 4, 5]}
>>> with open('tmp.dump', 'w') as fp:
... pickle.dump(a, fp)
...
>>> with open('tmp.dump') as fp:
... b = pickle.load(fp)
...
>>> print b
{'a': 1, 'c': [3, 4, 5], 'b': 2}
- json
- JSON形式のデータへのエンコード•デコード
>>> a = {'a':1, 'b':2, 'c':[3, 4, 5]}
>>> with open('tmp.dump', 'w') as fp:
... json.dump(a, fp)
...
>>> with open('tmp.dump') as fp:
... b = json.load(fp)
...
>>> print b
{u'a': 1, u'c': [3, 4, 5], u'b': 2}
- pprint
- 複雑なデータの整形表示
- collections.defaultdict
- デフォルト値のある辞書
>>> import collections
>>> dd = collections.defaultdict(list)
>>> datas = [('aaa', 1), ('bbb', 2), ('ccc', 3), ('bbb', 4), ('aaa', 5)]
>>> for k,v in datas.items():
... dd[k].append(v)
...
>>> print dd
defaultdict(<type 'list'>, {'aaa': [1, 5], 'bbb': [2, 4], 'ccc': [3]}))
- bisect
- ソート済のリストに要素を挿入
- bisect.insort_left(リスト, 要素)
- ソート済のリストに要素をソートを保って追加
- bisect.insort(リスト, 要素)
- bisect.insort_right(リスト, 要素)
- ソート済のリストに要素をソートを保って追加
同じ要素があれば、その右に追加
- bisect.bisect_left(リスト, 要素)
- ソート済のリストに要素をソートを保って追加できるインデックスを返す
- bisect.bisect(リスト, 要素)
- bisect.bisect_right(リスト, 要素)
- ソート済のリストに要素をソートを保って追加できるインデックスを返す
同じ要素があれば、その右に追加できるインデックスを返す
>>> import bisect
>>> list1 = [1, 2, 3, 4, 5]
>>> bisect.insort(list1, 2.5)
>>> print list1
[1, 2, 2.5, 3, 4, 5]
>>> bisect.bisect(list1, 3.5)
4
その他のライブラリ
- maya.cmds
- MayaのPython関数
- pymel.core
- PyMEL
- PIL
- 画像データを扱うモジュール
>>> from PIL import Image
>>> im = Image.open('tmp/tmp.tiff')
>>> im.show() # 画像の表示
>>> im.getpixel((10,20))
(194, 172, 73)
>>> im.putpixel((30,50), (255, 0, 0))
>>> imc = im.load() # 画像データの取り出し
>>> imc[5,6]
(2, 0, 8)
>>> imc[10,15] = (0, 0, 255)
>>> im2 = Image.new('RGB', (256, 256))
>>> im2.save('tmp/tmp2.png')
スコープ
スコープとはオブジェクトの有効範囲のことである。
- ビルトインスコープ
- 宣言やインポートをしないでも使えるスコープ。
組み込み関数•変数など。
- モジュールスコープ
- モジュールのトップレベルで定義されたスコープ。
スクリプトファイルとほぼ同じ。
クラス内もモジュールスコープとして扱われる。
- ローカルスコープ
- 関数•インスタンス内のスコープ。
PythonからC言語の呼び出し
Pythonから呼び出す関数の入ったC言語プログラム作成の方法とコンパイル。
- <Python.h> をインクルードする。
他のインクルードファイルより先にインクルードしておく。
- 関数宣言の方法
static PyObject * 関数名(PyObject *self, PyObject *args)
- self
- 呼び出し側が関数の場合はモジュール、メソッドの場合はインスタンス
- args
- 呼び出し側の引数が入ったタプル
PyArg_ParseTuple() によって値を取り出す。
- 関数の返り値
- 返り値なし
- Py_RETURN_NONE を実行
- 返り値あり
- Py_BuildValue() によって返り値をタプルに変換して返す
Py_BuildValue("") とするとNoneが返る。
- 関数をPythonで使えるモジュールとして登録(メソッドテーブルと初期化関数)
static PyMethodDef 配列名[] = {
{"関数名", 関数のアドレス, フラグ, "コメント"},
.
.
{NULL, NULL, 0, NULL}
};
void initモジュール名()
{
Py_InitModule("モジュール名", 配列名);
}
フラグは、数値•文字列を引数にするだけなら METH_VARARGS でOK。
- setup.pyの作成
from distutils.core import setup, Extension
module = Extension('モジュール名', ['C言語プログラム.c'])
setup(name='モジュール名', version='バージョン番号', ext_modules=[module])
- コンパイル
以下のコマンドでカレントディレクトリに モジュール名.so が作成される。
# python setup.py build_ext -i
PyArg_ParseTuple()とPy_BuildValue()の書式化単位
- s
- 文字列
- i
- int
- I
- unsigned int
- f
- float
- d
- double
例
以下のファイルを用意して、makeを実行しchk.pyでチェックする。
- myimport.c
#include <Python.h>
#include <math.h>
static PyObject *
myimport(PyObject *self, PyObject *args)
{
int n;
if(!PyArg_ParseTuple(args, "i", &n))
return NULL;
printf("%d\n", n);
Py_RETURN_NONE;
}
static PyObject *
myimport2(PyObject *self, PyObject *args)
{
double x, y, z1, z2;
if(!PyArg_ParseTuple(args, "dd", &x, &y))
return NULL;
z1 = sqrt(x + y);
z2 = sqrt(x * y);
return Py_BuildValue("dd", z1, z2);
}
static PyMethodDef myimport_methods[] = {
{"myimport", myimport, METH_VARARGS, "print number."},
{"myimport2", myimport2, METH_VARARGS, "return 2 sqrt."},
{NULL, NULL, 0, NULL}
};
void initmyimport()
{
Py_InitModule("myimport", myimport_methods);
}
- setup.py
from distutils.core import setup, Extension
module = Extension('myimport', ['myimport.c'])
setup(name='myimport', version='1.0', ext_modules=[module])
- Makefile
myimport.so : myimport.c
python setup.py build_ext -i
- chk.py
import myimport
myimport.myimport(5)
print [myimport.myimport2(i, i) for i in range(10)]