Software_Python2

☆Python

◎文法つづき


◆関数の定義と呼び出し

_◇関数の定義

defで関数の定義を開始する
本体はインデントする
⇒本体の最初の文としてdocstringをおくことができる
⇒関数の中では通常グローバル変数は参照しかできない
⇒グローバル変数と同じ名の変数に代入すると同名のローカル変数が作られる
(global文で指定すれば値の代入が可能となる)
⇒関数定義により関数名がシンボル表に加えられる
⇒関数名の値を他の名前に代入すれば関数の別名となる

※引数はcall by value
⇒しかしvalueはオブジェクトの参照

構文)

def 関数名(引数):
    """docstring"""
    処理を記述したブロック
    return 戻り値

例)

def show_team(teams):
    for team in teams:
        print team

※returnは一つの値を返すが、リストなどのオブジェクトでもよい
※return文の戻り値を省略した場合、戻り値はNoneとなる
※return文そのものを省略した場合も戻り値はNoneとなる

※引数は以下の3通りの記述方法がある
①位置依存引数で、順番を合わせ、引数の数を合わせて呼び出す
②位置依存引数で、デフォルト値を用いて一部を省略する
⇒デフォルト値のある引数はデフォルト値なしの引数よりも後に記述する必要がある。
③キーワード引数を使って引数の位置に関係なく値を渡す
⇒キーワード引数と位置で決まる引数を混在させる場合は、キーワード引数が後にこなければならない

※デフォルト値の設定
def ask_ok(prompt, retries=4, complaint=’Yes or no, please!’):
⇒デフォルト値は関数を定義した時点で、定義を行っているスコープで一度だけ評価される。

※キーワード引数の例
⇒コール時のキーワードには仮引数の名前をつかう
⇒仮引数にデフォルト値を与えておいてもよいが、デフォルト値を与えた仮引数の前におかれた仮引数は位置指定型引数となるのでキーワード引数には使えない

def who_have_what(who, what):
    return who + " have " + what + "."

who_have_what(who='aho', what='baka')

※ディクショナリを受け取る仮引数
**名前
⇒仮引数リストの最後におく
仮引数に対応するキーワードを除く、全てのキーワード引数が入る
⇒仮引数リストにないキーワードで値を渡すこともできる

※仮引数リストよりも長い位置指定型引数の受け取り
*名前
⇒**名前がある場合にはその前に、無い場合には末尾におく

_◇引数リストのアンパック

引数にしたいものがリストやタプルの場合 *演算子を引数につけて関数を呼びだすことでアンパックした引数を関数に渡すことができる

例)
range(*args)

_◇lambda式
lambdaをつかうと無名の関数を記述することができる
以下の例は、関数を返す関数を作る

例)

def make_inc(n):
    return lambda x: x + n

f = make_inc(1)

とすれば、make_incは+1する関数定義を返すので、fは+1する関数となり
f(0)
1
のようにふるまう

_◇関数デコレータ構文

@classmethod


◆ビルトイン関数、メソッド

_◇算術関数

※abs(arg)
絶対値。複素数に対して適用することも可能。

※divmod(a, b)
複素数以外の数を引数として整数除法を行い、商と剰余ペアを返す

※float(x)
│ 整数を浮動小数点数に変換する

※int()
│ 浮動小数点数を整数に変換する

※int([x[,base]])
│ 文字列xまたは浮動小数点数を基数baseに従って整数に変換する
│ 16進文字列からの変換の場合0xが頭についても良い。
│ 基数を0とすると文字列内容(0xがついているかなど)により判定する
│ xが文字列でないとTypeErrorを送出する

※long([x[,base]])
文字列または数値を長整数値に変換する。

※pow(x,y[,z])
xのy乗。zがあれば、zのy乗のzのモジュロ。

※round(x[,n])
xを小数点以下n桁で丸めた浮動小数点数を返す。
⇒最も近い10のマイナスn乗の倍数に丸められる
⇒2つの倍数と等距離な場合は、ゼロから離れる方向に丸められる

_◇複素数型

※complex([real[,imag]])
real + imag*jの複素数型を生成する。
最初の引数が文字列の場合は、文字列を複素数型に変換する。

_◇文字列関数

※basestring()
strおよびunicodeのスーパクラス。オブジェクトがstrやunicodeのインスタンスであるかどうか調べる場合に利用できる。
isinstance(obj, basestring)

※bin(x)
│ 整数値をバイナリ文字列に変換する

※chr(i)
ASCIIコードが整数iである文字1文字からなる文字列を返す。
⇒iが範囲外にあるときは ValueErrorが投げられる

※len(文字列) 文字列、リストの長さを返す

※str()
│ 渡されたオブジェクトを人間が可読な表現の文字列に変換する
│ 人間が読み下せない場合はrepr()と同じ
│ 浮動小数点数値の場合、有効桁数12桁で表現する

※repr()
│ 渡されたオブジェクトをインタプリタが可読な表現の文字列に変換する

※hex(x)
│ 整数値を16進文字列(0xつき)に変換する

※oct(x)
│ 整数を8真文字列に変換

※ord(c)
│ 長さ1の文字列、ユニコードであればコードポイント整数値、8ビット文字列ならば8ビットのバイト値を返す。

※str(obj)
印字可能にした文字列を返す。

※unichar(i)
ユニコードのコードがiになるような1文字ユニコード文字列を返す。

※unicode([object[, encoding[, errors]]])
objectのUnicode文字列を返す。

_◇文字列メソッド

※str.split()

※str.replace(検索文字列、置換文字列)

※str.rjust(指定幅)
文字列の左側にスペースを追加し、指定の幅に右揃えする

※str.ljust(n)
文字列の右側にスペースを追加し、指定の幅に左揃えしない
⇒文字列が指定の幅より長いときはなにもしない
⇒文字列を左から指定の幅nに切りつめたいときはスライスを使う
│ str.ljust(n)[:n]

※str.center(n)
n幅にセンタリング

※str.zfill(n)
数字からなる文字列の左にゼロフィルする。符号も解する。

※str.format
文字列中の{}内の文字(フォーマットフィールド)をformatメソッドに渡されるオブジェクトで置き換える。中かっこの中にはオブジェクトの位置を参照するための数字を入れることができる
⇒数値でなくキーワード引数を使うこともできる

例)'{0} and {1}’.format(‘a’, ‘b’)

⇒!a ascii()適用、!s str()適用、 !r repr()適用によりフォーマット前の値変換も可能。

例)'{!r}’.format(math.pi)

⇒フィールド名の後ろに : とフォーマット指定子をつけることができる

例){0:.3f} 浮動小数、小数点以下3桁
│ {0:10d} 最小幅10文字の整数

_◇format()

_◇配列関係
※bytearray([source[, encoding[, errors]]])
バイト配列を返す。文字列にする場合は、encodingとオプションのerrorsパラメータも湧耐える。

_◇辞書関係

※dict()
新しい辞書型データを作成する。

_◇リスト関数

※filter(function, sequence)
sequenceの要素itemからfunction(item)が真となるような要素からなるシーケンスを返す。
sequence: string, tuple, list
戻り値はsequenceと同じ型

def f(x): return x % 2 != 0 and x % 3 != 0

filter(f, range(2, 25))

※list(iterable)
iterableの要素と同じ要素を持ち、順番も同じリストを返す。

※map(function, sequence)
sequenceの要素itemにfunction(item)を適用し、その戻り値からなるリストを返す。

※range([start], stop[, step])
等差数列を含むリストを生成する。
startを省略すると0に、stepを省略すると1になる。
⇒xrange()関数はrangeと似ているが、”xrangeオブジェクト”を返す。リストと似ているが、巨大な範囲の場合に効果を発揮する。

※reduce(function, sequence)
functionは2引数をとる関数。sequenceの最初の2つの要素にfunctionを適用し、その戻り値と次の要素を引数にとるということを順次繰り返して、一つの結果を得る。

※sorted(iterable[, cmp[, key[, reverse]]])
並べ替え済のリストを返す

※zip([iterable,…])
タプルのリストを返す。
複数のデータ系列を系列の内の最短の長さのものに合わせた一本のリストにまとめることができる。

_◇タプル関係

tuple([iterable])
iterableの要素と要素、順番に同じタプルを返す。

_◇セット関係

※set([iterable])
新しいセット型オブジェクトを返す。

_◇スライス関係

※slice([start], stop[,step])
スライスオブジェクトを返す

_◇論理関数、判定関数

※bool([x])
値をブール値に変換する。xを省略するとFalseを返す

※callable(obj)
objが呼び出し可能であればTrueを返す。
⇒Trueを返しても呼び出しが失敗することがあるが、Falseの場合は決して成功しない。

※cmp(x,y)
オブジェクトの比較結果に基づいて 負、ゼロ、正を返す

_◇インスタンス、クラス

※isinstance(object, classinfo)
引数objectが classinfoのインスタンスか、サブクラスのインスタンスの場合に真を返す。

※issubclass(class, classinfo)
classがclassinfoのサブクラスである場合に真を返す。

※staticmethod(func)
funcの静的メソッドを返す。
⇒静的メソッドは暗黙の第一引数をうけとらない。

※super([type[, object-or-type]])
メソッドの呼び出しをtypeの親または兄弟クラスに委譲するプロキシオブジェクトを返す。オーバライドされた継承メソットにアクセスするためなどに使う。

※type
type(object)
│ objectの型を返す
type(name, bases, dict)
│ 新しい型オブジェクトを返す。

_◇オブジェクト操作

※delattr

※getattr

※hasattr

※hash(object)

※id(object)

※len(オブジェクト)
│ 文字列、リスト、タプル、辞書など各種オブジェクトの長さを返す

※memoryview(object)

※object()
新たなオブジェクトを返す。クラスの基底クラス。

※property()

※setattr()

_◇反復子関係

※all(iterable)
iterableの全ての要素が真か、iterableが空ならば真

※any(iterable)
iterableのいずれかの要素が真ならば真、iterableが空ならば偽

※enumerate(sequence[, start=0])
⇒列挙オブジェクトを返す。返されるオブジェクトのnext()メソッドは、カウント値とsequenceの対応オブジェクトを含むタプルを返す。
例)
for i, x in enumerate([‘A’,’B’,’C’])

※frozenset

※iter(コンテナオブジェクト)
⇒反復子オブジェクトを返す
⇒2つ目の引数sentinelを与えるとsentinelと等しくなるまでオブジェクトを呼び出すシーケンスが得られる

例)

with open('f.txt') as f:
    for line in iter(f.readline, "STOP"):
        ...

※max(iterable[, args…][key=func])
⇒iterable引数のみの場合、要素のうちの最大のものを返す。
複数の引数が与えられた場合は、引数間で最大のものを返す。
⇒keyに順序づけ関数funcを与えると比較に使われる

※min(iterable[, args…][key=func])
⇒max同様のmin

※next(反復子オブジェクト)
⇒反復子オブジェクトの__next__()メソッドをコールし、何か一つを取り出す

※reversed(seq)
要素を逆順に取り出すイテレータを返す

※sum(iterable[, start])
iterableの要素を、startから左から右へ総和を求めて返す。
⇒文字列や、浮動小数点数、イテラブルの連結もできるが他の方法の方が良い。

_◇システム関係

※dir([obj])
モジュールがどのような名前を定義しているか返す。返り値はソート済の文字列リスト
⇒引数にモジュール名をあたえるが、引数を与えないと現在定義されている名前のリストを返す
⇒変数、モジュール、関数など含まれる

※help()
引数のオブジェクトの説明を得る
文字列を渡すとその文字列でドキュメントを検索する

①help(‘modules’)
⇒モジュール名の一覧を得る

②help(‘keywords’)
⇒キーワード一覧を得る

③help(‘topics’)
⇒トピック一覧を得る

※reload(module)
すでにインポートされたモジュールを再解釈、最初期化する。

※vars()
ローカル変数をすべて含んだディクショナリを返す
⇒引数無しでは、locals()と同じ
⇒返される辞書を変更した場合の動作は未定

_◇入出力

※file()
file型のコンストラクタ。通常は、open()を呼び出す。fileを直接記述するのは型テストを行うときなど
例)
isinstance(f, file)

※input([prompt])
⇒eval(raw_input(prompt))と同じ
入力が有効なPythonの式でない場合、各種の例外が投げられるので注意
⇒readlineモジュールが読み込まれていれば、行編集およびヒストリ機能を使える

※open(filename[, mode[, bufsize]])

※print()

※raw_input([prompt])
引数promptが存在するとその末尾の改行を除き、標準出力に出力する。
入力から1行読み込んで、末尾の改行を除いた文字列として返す。
EOFが読み込まれると、EOFErrorが投げられる。
⇒readlineモジュールが読み込まれていれば行編集、ヒストリ可能


◆クラス

※クラス自身がオブジェクト

_◇クラス定義の構文

class ClassName:
    ステートメント

⇒クラス定義は関数定義同様、一度実行する必要がある
⇒通常、クラス定義の中は関数定義である
⇒クラス内での関数定義の引数リストは通常と異なるメソッドの呼び出し規則による
⇒クラス定義の中で関数定義以外の文も使うことができる
⇒クラス定義中では新たなクラス自身の名前空間がローカルスコープとなる
⇒クラス定義から正常に抜けるとクラスオブジェクトが作られる
⇒クラス定義ヘッダで命名したクラス名は、クラス定義の外側のローカルスコープで、定義したクラスオブジェクトに結合される

_◇クラスオブジェクト

※属性参照
obj.nameで参照できる
クラスオブジェクト生成時にクラスの名前空間にあった全ての名前にアクセスできる
__doc__属性により、クラスのdocstringにアクセスすることもできる

※インスタンス化
クラスオブジェクトを関数を呼ぶように書けばインスタンスが返る

例)
x = MyClass()

※クラスの初期化のため、__init__()という特殊メソッドが定義できる
⇒__init__()メソッドが定義してあると、インスタンス化により生成されたインスタンスに対して自動的に呼ばれる

例)

    def __init__(self):
        self.data = []

※__init__()メソッドに, self以外の引数を与えることができる。
⇒クラスのインスタンス化で与える引数が__init__()に渡される

※インスタンスオブジェクト
属性参照のみできる
①データ属性
データ属性は宣言しなくても、代入すれば存在を始める

②メソッド
⇒クラス属性のうち、関数オブジェクトであれば、インスタンスメソッドを規定する

※オジュベクトには自分のクラスがある
⇒object.__class__に格納されている

※インスタンスオブジェクトの属性
メソッドm
│ m.__self__ インスタンスオブジェクト
│ m.__func__ 関数オブジェクト

_◇メソッドオブジェクト

x.f()のようにメソッドを呼び出すと直ぐに実行される。
⇒以下のように引数の括弧を抜きに呼び出すと、メソッドオブジェクトを格納し後から実行することができる。
xf=x.f
実行は
xf()

※データ属性でないインスタンス属性の参照
⇒クラスの中の検索
⇒名前が関数オブジェクトとして有効であれば、それとインスタンスオブジェクトへのポインタを抽象オプジェクトの中にパッキングし、メソッドオブジェクトが作られる。

_◇クラスメンバ

※C++的には通常はpublic
※メンバ関数は virtual
⇒プライベートなインスタンス変数は存在しない
⇒慣習としてアンダースコアが前置された名前は非公開とすることが多い

※データ属性は同盟のメソッドを隠ぺいしてしまうので、衝突の可能性をさげるために、衝突を防ぐような命名規約を使うこと

※名前マングリング
サブクラスでの名前衝突を防ぐ
2つ以上のアンダースコアが前置された識別子がクラスネーム付に置き換えられる

__spam
⇒_classname__spam

_◇メソッド関数

メソッドは通常の関数と異なる引数の渡され方をする

宣言時には第1引数として、オブジェクト自体を示すものを明示的に取る
⇒コール時には暗黙に与えられる。
⇒第1引数として、インスタンスのオブジェクトが渡される
⇒n個の引数でのメソッド呼び出しは、先頭のインスタンスオブジェクトとあわせてn+1個の引数での呼び出しと等価

※メソッドの第1引数は self と書かれることが多いが慣習である。

※関数定義がプログラムテキスト中でクラス定義中にあることは必須でない。
⇒外部で定義された関数の関数オブジェクトをクラスのローカル変数に代入してもよい。
※メソッドは引数selfのメソッドを使う形で、クラスの中の他のメソッドをコールできる。

※メソッドはグローバルな名前を参照できる。
⇒メソッドのグローバルスコープはクラス定義が存在するモジュール(クラス自体ではない)
⇒グローバルスコープにインポートされた関数や、モジュールで定義されている他のものなどを利用できる。

_◇クラスの継承

※派生クラスの定義構文

class DerivedClassName(BaseClassName):
    文

⇒BaseClassName(基底クラス名)は、この定義が存在するスコープで定義済みの名前でなければならない。
⇒他のモジュールで定義してある場合
class DerivedClassName(modname.BaseClassName):

※リクエストされた属性が派生クラスになければ、基底クラスが検索される。この過程は再帰的に起こる

※インスタンスの型チェック
isinstance()
例)
│ isinstance(obj, int) … obj.__class__がintおよびその派生クラスで真

※クラス継承のチェック
issubclass()
例)
│ issubclass(bool, int)…boolがintのサブクラスなので真となる

_◇多重継承

多重継承の構文)

class DerivedClassName(Base1, Base2, Base3):
    文

※属性
│ 親クラスから深度優先で左から右
⇒ヒエラルキーにオーバラップがあっても、同じクラスを2度サーチすることはない
⇒call-next-method 他の多重継承言語とも共通する
⇒super()コールによるメソッド解決順は動的に変化する
│ 多重継承では網状の親子関係が起こるため

_◇メソッドのオーバーライド

派生クラスは基底クラスのメソッドをオーバーライドできる。

込み入った例)
基底クラス内で、メソッドa, bを定義
│ メソッドaはメソッドbを呼び出す
派生クラス内で、メソッドbをオーバーライド
⇒基底クラスのaを呼び出せば、基底クラスのbが実装される
⇒派生クラスでaを呼び出せば、基底クラスのaが呼び出されるが、そこから呼び出されるbは派生クラスのものである

※基底クラスのメソッドの呼び出し方法
BaseClassName.methodname(self , arguments)

_◇構造体の代用
空のクラス定義は構造体やレコード型の代用として使える

class Employee:
    pass

⇒レコード生成
john = Employee()
⇒フィールド代入
john.name = ‘john Doe’

_◇クラスに反復子の振る舞いを追加する

※オブジェクトに__next__()メソッドをつけて返す__iter__()メソッドを定義する
⇒クラス自体に__next__()が定義してあれば__iter__()はselfを返すだけでよい

例)

class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    def __iter__(self):
        return self
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


◆メソッド

オブジェクトに所属した関数
⇒Pythonではクラス以外のオブジェクトでもメソッドを持てる

構文) obj.methodname

_◇obj.join()


◆入出力

_◇式文
expression statement

対話モードで式だけを入力すると式の値が出力される

_◇標準入出力

※標準出力
sys.stdout

_◇print

①Python 2.xでは print文

構文)
print 値1, 値2, …

⇒値リストを()でくくれば②と同じ形となる

※ファイル的なオブジェクトへの出力
print >>file, 値1, …

②Python 3では print関数

構文)
print (値1, 値2, …)

_◇input

_◇file

※open()
ファイルオブジェクトを返す
構文例)
│ open(ファイル名, モード)

例)
│ f = open(‘workfile’, ‘w’)

⇒ファイルモード
r 読み出しのみ(デフォルト)
w 書き出しのみ
a 追加
r+ 読み書き
⇒通常はテキストモード、モードにbを追加するとバイナリモード
⇒テキストモードでは、プラットフォーム行末文字(Windowsの\r\n)は\nに変換され、書き込み時にプラットフォーム行末文字にもどされる

※f.read(サイズ)
ファイルオブジェクトfから指定量だけよみこみ、文字列またはバイト数のオブジェクトとして返す。サイズを省略したり、負数であると、ファイル全体となる。
⇒ファイル末尾では空文字列”を返す。

※f.readline()
ファイルから一行読む。文字列末尾には改行文字が残る
⇒空行は改行文字のみの文字列となる
⇒空の文字列はファイル末尾でしか返らない

※f.readlines(目安バイト数)
引数なしでよぶと、ファイルの全行の入ったリストを返す。目安バイト数を与えると、目安バイト以上を含む行のリストが返る。

※ファイルオブジェクトにループをかける方法で行を読みこむ
例)
for line in f:
⇒r.readline系とは行バッファの管理が異なるので、混ぜてはいけない。

※file.write(文字列)
文字列の内容をファイルに書き込み、書き込まれたキャラクタの数を返す
⇒文字列でないものを書き込む場合には文字列に変換しておく

※f.tell()
ファイルの中での現在位置を返す。ファイル先頭からのバイト数

※f.seek(オフセット、起点)
現在位置を起点により決まる参照点位置とオフセットの和で示される位置におく
⇒起点
0ファイル先頭(デフォルト)
1現在位置
2ファイル末尾

※テキストファイルの場合、ファイル先頭からの相対位置か、ファイル末尾以外にはシークできない。
例)ファイル末尾へのシーク
seek(0,2)

※f.close()
オープンしたファイルが占めていたシステムリソースを開放する

_◇with

withをつかうことで、ファイル操作途中で例外が発生してもファイルが正しく閉じられる
例)

with open('file.txt', 'r') as f:
    read_data = f.read()
f.closed

_◇pickleモジュール

⇒read()は文字列しか返さないので、数の場合、int()のような関数で数値に戻す必要がある。さらに、リスト、ディクショナリ、クラスなどはそのままではできない。

※pickleモジュール
ほぼすべてのPythonオブジェクトを文字列表現に変換するモジュール
│ pickling ピクルス化
│ unpickling アンピックル
⇒ファイルへのセーブ、ロード以外にリモートマシンに送り込むこともできる

例)オブジェクトxをファイルオブジェクトfに書き込む
pickle.dump(x, f)

例)アンピックルの例
x = pickle.load(f)


◆エラーと例外

_◇構文エラー
syntax error

パース上のエラー

_◇例外
exception

実行中に検知されるエラー

※型
⇒ビルトイン例外では型と名前が一致する

ZeroDivisionError
NameError
TypeError
ValueError
。。。

※ユーザーからのプログラムへの割り込み
⇒Control-CなどOSのサポートするキーによる
KeyboardInterrupt例外

_◇例外の処理

※try文
⇒tryとexceptの間のtry節が実行される
⇒例外が送出されなければtry文の実行は終了。except節はスキップされる
⇒例外が発生すると、発生以降のtry節はスキップされ、発生例外の型がexceptキーワードの後で指定した例外と一致すればexcept節が実行される。
⇒except節で指定された名前と一致しなければ、より外側のtry文に例外が渡される。ハンドラがみつからなければ、エラーメッセージを表示して終了する

例)

while True:
    try:
        x=int(input("xxx"))
        break
    except ValueError:
        print("Try Again.")

⇒except節は複数設けられるが、実行されるのは一つだけ
⇒1つのexcept節で複数の例外を指定する場合はタプルで指定する
例)

    except (RuntimeError, TypeError, NameError) :
        pass

⇒最後のexcept節の例外名を省くとワイルードカードとなる
⇒例外ハンドラはtry節から間接的にコールされた関数内で発生した例外も処理できる。

※例外の引数
例外によっては引数が付随する。
⇒except節の変数で例外インスタンスを受ける
⇒引数は例外インスタンスの.argsに格納されている
⇒インスタンスの型はtype()で取り出せる
例)

    except Exception as inst:
        print(type(inst))
        print(inst.args)
⇒Python3x

    except Exception, var:
⇒Python2x

※else節
オプションelse節を全てのexceptの後におくことができる
⇒try節が例外を送出しなかったときだけ実行される
⇒try文でプロテクトすべきでないコードはelseにおくべき

_◇例外の送出

※raise 送出例外(例外の引数)
⇒Python3x

※raise 例外, 引数
※raise 例外(引数)
※raise 例外, 引数, トレースバックオブジェクト
⇒Python2x

⇒except節中にraise文を単独でおけば、受けた例外を再送出できる

※クラスを使った例外送出構文
raise Class
│ ⇒Classは、typeまたはその派生クラスであること
raise Class()
raise Instance

⇒送出された例外がexcept節と合致するのは、例外から見て同じクラスか自分の基底クラスのとき
⇒未処理例外のエラーメッセージでは、例外のクラス名が書かれるとともに、最後にインスタンスがビルトイン関数str()で文字列化されて表示される

_◇組み込み例外

_◇ユーザ定義例外
例外クラスを作成すれば、独自例外を含めることができる
通常、例外はExceptionクラスから派生させる

例)

class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

⇒Exceptionクラスの__init__をオーバライドし、args属性の生成でなく、value属性の生成としている。

※例外クラスでは通常複雑なことはせず、ハンドラが必要とするエラー情報を属性として提供する程度にとどめる。

※異なるエラーを送出できるモジュールでは、モジュールで定義する例外のベースクラスを作ったのち、それぞれのエラーのサブクラスを書くとよい。

※例外にはErrorで終わる名前をつけるのが良い作法である

_◇クリーンアップ動作
try文にはオプショナル finally節をおいて、例外の発生に関わりなく、try文から抜ける前に実行すべき動作を記述することができる
⇒except節で処理されなかったり、except節やelse節内での例外送出に先だって実行される。
⇒try文内から、break, continue, return文に抜ける際にも出口で必ず実行される。
⇒リソースの開放に便利

※ファイルリソースの解放ではwith文を使うのが良い
⇒with文は、オブジェクトに定義してあるクリーンアップ動作を利用するのに使える


◆コンパイル、ソースの実行

_◇compile

_◇eval(expression[, globals [, locals]])

expressionは文字列
globalsとlocalsは辞書

_◇exec

_◇execfile(filename[, globals [, locals]])
ファイルを読み込み、Python文列として評価する。
※import文と異なり、モジュール管理機構を使用しない

_◇globals()
現在のグローバル辞書を返す

_◇locals()
現在のローカル辞書を返す

_◇ast.literal_eval()


◆Python2xとPython3系の違い

_◇Unicodeの扱い

Python3.0
│ 文字列はユニコード
│ Unicode-Escapeエンコーディング
│ 例)\u0020
⇒文字列のバイト列変換
│ ’あいう’.encode(‘utf-8′)

Python2
│ 文字列はアスキー
⇒文字列のバイト列変換
│ u’あいう’
│ SJISバイト列が得られる

_◇print

Python3.0
│ print()は関数
│ キーワード引数endが使える

_◇反復子とリスト

※range()

Python2.x
│ リストを返す
Python3.x
│ 反復可能体(iterable)を返す

※Python3系では、反復子やビューなどの遅延評価オブジェクトが返るが、Python2x系ではリストにして返るのがデフォルト
⇒効率が悪くなる


◆TIPS

_◇インポート時と直接実行時の判別

if __name__ == "__main__":
    main()

⇒直接呼び出された場合は main()が呼び出され、インポート時には呼び出されない。

※mainを関数としておくとmain()のテストがやりやすい


◆サンプル

_◇Hello World.

#! /usr/bin/env python
# coding: utf-8

def main():
    print "Hello World!!"

if __name__ == "__main__":
    main()