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
ヌル文字

変数

算術演算子

リスト

空リスト
[ ]
初期化
変数 = [要素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式によって無名関数を定義することができます。

func = lambda args: expr

この式は以下の関数定義と同じです。

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]
式が真になるのは以下の場合 式が偽になるのは以下の場合
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)
xyを比較して、等しければ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 別名
モジュールを別名でインポート

モジュールファイル

パッケージ

モジュール検索順

  1. 実行しているスクリプトのあるフォルダ(ディレクトリ)
  2. カレントフォルダ(ディレクトリ)
  3. 環境変数PYTHONPATHに設定されたフォルダ(ディレクトリ)
  4. 標準ライブラリのフォルダ(ディレクトリ)
  5. 標準ライブラリのフォルダ(ディレクトリ)にある追加パッケージ用の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)
spatternで分解したリストを返す
>>> 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でしか使用できない
シリアライズできるもの
>>> 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言語プログラム作成の方法とコンパイル。

PyArg_ParseTuple()とPy_BuildValue()の書式化単位

s
文字列
i
int
I
unsigned int
f
float
d
double

以下のファイルを用意して、makeを実行しchk.pyでチェックする。